- 浏览: 243562 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
saiyaren:
你对hiphop的深入程度到了什么程度了?想和你进行探讨一下
facebook hiphop php vm 实现概述 -
eric_weitm:
lj3362569 写道可以再讲具体点么?还有现有的hipho ...
facebook hiphop php vm 实现概述 -
lj3362569:
可以再讲具体点么?还有现有的hiphop不支持哪些功能?
facebook hiphop php vm 实现概述
集成spiderMonkey
文档 :https://developer.mozilla.org/En/SpiderMonkey/JSAPI_User_Guide
https://developer.mozilla.org/en/How_to_embed_the_JavaScript_engine
一、hello world基本流程:
JS_NewRuntime
JS_NewContext
JS_SetOptions
JS_SetErrorReporter
JS_NewCompartmentAndGlobalObject ------创建global对象
JS_InitStandardClasses ---------------- 把运行时内置的函数、对象、常量等作为global object的属性导出
ok = JS_EvaluateScript(cx, global, script, strlen(script), filename, lineno, &rval); ----解释执行
if (rval == NULL | rval == JS_FALSE) // 判断运行状态
return 1;
str = JS_ValueToString(cx, rval); // 处理运行结果
二、暴漏c的函数(本地的wrapper是作为js的回调挂上去的)
本地wrapper的基本格式要求 typedef JSBool (*JSNative)(JSContext *cx, uintN argc, jsval *vp);
1、返回值是 JSBool(JS_TRUE 正常得到结果,JS_FALSE执行时出现异常)
2、第一个参数是 JSContext
3、第二个参数是 argc(js代码中传进来的参数个数)
4、第三个参数是 jsval *, 可以用来取得参数、this、返回值等
5、调用成功时 JS_SET_RVAL + return JS_TRUE
调用失败时 JS_ReportError + return JS_FALSE
三、常用技术
1、JS_ARGV(cx, vp) 指向参数数组的第一个元素
2、JS_RVAL(cx, vp) 指向返回值
3、JS_SET_RVAL(cx, vp, value) 设置返回值
4、JS_THIS_OBJECT(cx, vp) 取this对象
5、JS_THIS(cx, vp) jsVal版本的this
6、JS_CALLEE(cx, vp) 被调用的函数对象
四、例子
JSBool myjs_rand(JSContext *cx, uintN argc, jsval *vp)
{
JS_SET_RVAL(cx, vp, DOUBLE_TO_JSVAL(rand()));
return JS_TRUE;
}
/* A wrapper for the srand() function, from the C standard library.
This example shows how to handle optional arguments. */
JSBool myjs_srand(JSContext *cx, uintN argc, jsval *vp)
{
uint32 seed;
// 把输入的参数转变格式,存入输出中, 参数依次是cx,调用者传入参数个数,传入的参数,输出的格式,输出地址
if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "/u", &seed))
return JS_FALSE;
/* If called with no arguments, use the current time as the seed. */
if (argc == 0)
seed = time(NULL);
srand(seed);// 初始化一个种子
JS_SET_RVAL(cx, vp, JSVAL_VOID); /* return undefined */
return JS_TRUE;
}
/* A wrapper for the system() function, from the C standard library.
This example shows how to report errors. */
JSBool myjs_system(JSContext *cx, uintN argc, jsval *vp)
{
JSString* str;
char *cmd;
int rc;
if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "s", &str))
return JS_FALSE;
cmd = JS_EncodeString(cx, str); // js string 转成 c的char *
rc = system(cmd);
JS_free(cx, cmd);// 不用了,释放掉
if (rc != 0) {
/* Throw a JavaScript exception. */
JS_ReportError(cx, "Command failed with exit code %d", rc);// 抛出异常给js,js中可以用try catch检测到
return JS_FALSE;
}
JS_SET_RVAL(cx, vp, JSVAL_VOID); /* return undefined 没有返回值时也要显示的设置一下*/
return JS_TRUE;
}
//加入自定义函数
JSFunctionSpec my_functions[] = {
JS_FS("myprint", myprint, 0, 0, 0), // 依次是name, notive func, argc, tags, extra
JS_FS_END
};
JS_DefineFunctions(cx, objParent, my_functions);
五、暴漏对象 JS_InitClass + JS_DefineProperties
顺序:
1、属性id枚举
2、getter, constructer, destructer
3、class的template
4、class的函数表
5、JS_InitClass
6、JS_DefineProperties
网上找的一个例子:
***************************************************************************** getter, constructer, destructer******
// 属性Getter函数
enum{ EQFRONT, EQBACK, EQSIZE, EQEMPTY, EQARRAY};
JSBool MyClassGetter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
std::deque<int>* pQ = (std::deque<int>*)JS_GetPrivate(cx, obj);
if(!JSVAL_IS_INT(id)) return JS_TRUE;
switch(JSVAL_TO_INT(id))
{
case EQFRONT:
if(pQ->empty()) return JS_FALSE;
*vp = INT_TO_JSVAL( pQ->front() );
break;
case EQBACK:
if(pQ->empty()) return JS_FALSE;
*vp = INT_TO_JSVAL( pQ->back() );
break;
case EQSIZE:
*vp = INT_TO_JSVAL( pQ->size() );
break;
case EQEMPTY:
*vp = BOOLEAN_TO_JSVAL( pQ->empty() );
break;
case EQARRAY: //数组操作
{
//用JS_NewArrayObject生成数组
JSObject *objA = JS_NewArrayObject(cx, 0, NULL);
jsint idx = 0;
for(std::deque<int>::iterator itr=pQ->begin(); itr!=pQ->end(); ++itr)
{
jsval v = INT_TO_JSVAL(*itr);
//用JS_SetElement加入指定索引的数据
JS_SetElement(cx, objA, idx++, &v);
}
*vp = OBJECT_TO_JSVAL(objA);
break;
}
break;
}
return JS_TRUE;
}
// "构造"
JSBool MyClassConstructor(JSContext *cx, JSObject *obj, uintN argc,
jsval *argv, jsval *rval)
{
std::deque<int> *pQ = new std::deque<int>();
JS_SetPrivate(cx, obj, pQ);
return JS_TRUE;
}
// "析造"
void MyClassDestructor(JSContext *cx, JSObject *obj)
{
std::deque<int>* pQ = (std::deque<int>*)JS_GetPrivate(cx, obj);
delete pQ;
}
******************************************class template*****************************************
// 定义类
JSClass myClass={
"MyClass", // name
JSCLASS_HAS_PRIVATE, // tags
JS_PropertyStub, JS_PropertyStub, // 添加、删除属性的回调 默认是 JS_PropertyStub
MyClassGetter, JS_PropertyStub, // get set方法
JS_EnumerateStub, // 遍历属性
JS_ResolveStub, // 解析不存在的属性
JS_ConvertStub, // 转成原子类型
MyClassDestructor // 析构函数
};
*******************************************class的函数表***************************************
// 类方法
JSBool QPush(JSContext *cx, JSObject *obj, uintN argc,
jsval *argv, jsval *rval)
{
std::deque<int>* pQ = (std::deque<int>*)JS_GetPrivate(cx, obj);
if(JSVAL_IS_INT(argv[0]))
{
pQ->push_back(JSVAL_TO_INT(argv[0]));
}
return JS_TRUE;
}
JSBool QPop(JSContext *cx, JSObject *obj, uintN argc,
jsval *argv, jsval *rval)
{
std::deque<int>* pQ = (std::deque<int>*)JS_GetPrivate(cx, obj);
if(!pQ->empty())
{
pQ->pop_front();
}
return JS_TRUE;
}
JSFunctionSpec myClassMethod[]={
JS_FS("push", QPush, 1, 0, 0), // 依次是name, notive func, argc, tags, extra
JS_FS("pop", QPop, 0, 0, 0),
JS_FS_END
};
*****************************************JS_InitClass****************************
JSObject * newobj = JS_InitClass(cx, objParent, NULL, // cx, global obj, prototype,
&myClass, MyClassConstructor, 0, // 类构成模板,构造函数,构造函数参数个数
NULL, myClassMethod, // prototype中的属性和方法
NULL, NULL); // 构造函数的属性和方法
**************************************JS_DefineProperties************************
JSPropertySpec myClassProp[]={
{"front", EQFRONT, JSPROP_READONLY}, // names, c实现中的唯一id, flags, get函数, set函数
{"back", EQBACK, JSPROP_READONLY},
{"size", EQSIZE, JSPROP_READONLY},
{"empty", EQEMPTY, JSPROP_READONLY},
{"array", EQARRAY, JSPROP_READONLY},
{0}
};
JS_DefineProperties(cx, newobj, myClassProp);
文档 :https://developer.mozilla.org/En/SpiderMonkey/JSAPI_User_Guide
https://developer.mozilla.org/en/How_to_embed_the_JavaScript_engine
一、hello world基本流程:
JS_NewRuntime
JS_NewContext
JS_SetOptions
JS_SetErrorReporter
JS_NewCompartmentAndGlobalObject ------创建global对象
JS_InitStandardClasses ---------------- 把运行时内置的函数、对象、常量等作为global object的属性导出
ok = JS_EvaluateScript(cx, global, script, strlen(script), filename, lineno, &rval); ----解释执行
if (rval == NULL | rval == JS_FALSE) // 判断运行状态
return 1;
str = JS_ValueToString(cx, rval); // 处理运行结果
二、暴漏c的函数(本地的wrapper是作为js的回调挂上去的)
本地wrapper的基本格式要求 typedef JSBool (*JSNative)(JSContext *cx, uintN argc, jsval *vp);
1、返回值是 JSBool(JS_TRUE 正常得到结果,JS_FALSE执行时出现异常)
2、第一个参数是 JSContext
3、第二个参数是 argc(js代码中传进来的参数个数)
4、第三个参数是 jsval *, 可以用来取得参数、this、返回值等
5、调用成功时 JS_SET_RVAL + return JS_TRUE
调用失败时 JS_ReportError + return JS_FALSE
三、常用技术
1、JS_ARGV(cx, vp) 指向参数数组的第一个元素
2、JS_RVAL(cx, vp) 指向返回值
3、JS_SET_RVAL(cx, vp, value) 设置返回值
4、JS_THIS_OBJECT(cx, vp) 取this对象
5、JS_THIS(cx, vp) jsVal版本的this
6、JS_CALLEE(cx, vp) 被调用的函数对象
四、例子
JSBool myjs_rand(JSContext *cx, uintN argc, jsval *vp)
{
JS_SET_RVAL(cx, vp, DOUBLE_TO_JSVAL(rand()));
return JS_TRUE;
}
/* A wrapper for the srand() function, from the C standard library.
This example shows how to handle optional arguments. */
JSBool myjs_srand(JSContext *cx, uintN argc, jsval *vp)
{
uint32 seed;
// 把输入的参数转变格式,存入输出中, 参数依次是cx,调用者传入参数个数,传入的参数,输出的格式,输出地址
if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "/u", &seed))
return JS_FALSE;
/* If called with no arguments, use the current time as the seed. */
if (argc == 0)
seed = time(NULL);
srand(seed);// 初始化一个种子
JS_SET_RVAL(cx, vp, JSVAL_VOID); /* return undefined */
return JS_TRUE;
}
/* A wrapper for the system() function, from the C standard library.
This example shows how to report errors. */
JSBool myjs_system(JSContext *cx, uintN argc, jsval *vp)
{
JSString* str;
char *cmd;
int rc;
if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "s", &str))
return JS_FALSE;
cmd = JS_EncodeString(cx, str); // js string 转成 c的char *
rc = system(cmd);
JS_free(cx, cmd);// 不用了,释放掉
if (rc != 0) {
/* Throw a JavaScript exception. */
JS_ReportError(cx, "Command failed with exit code %d", rc);// 抛出异常给js,js中可以用try catch检测到
return JS_FALSE;
}
JS_SET_RVAL(cx, vp, JSVAL_VOID); /* return undefined 没有返回值时也要显示的设置一下*/
return JS_TRUE;
}
//加入自定义函数
JSFunctionSpec my_functions[] = {
JS_FS("myprint", myprint, 0, 0, 0), // 依次是name, notive func, argc, tags, extra
JS_FS_END
};
JS_DefineFunctions(cx, objParent, my_functions);
五、暴漏对象 JS_InitClass + JS_DefineProperties
顺序:
1、属性id枚举
2、getter, constructer, destructer
3、class的template
4、class的函数表
5、JS_InitClass
6、JS_DefineProperties
网上找的一个例子:
***************************************************************************** getter, constructer, destructer******
// 属性Getter函数
enum{ EQFRONT, EQBACK, EQSIZE, EQEMPTY, EQARRAY};
JSBool MyClassGetter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
std::deque<int>* pQ = (std::deque<int>*)JS_GetPrivate(cx, obj);
if(!JSVAL_IS_INT(id)) return JS_TRUE;
switch(JSVAL_TO_INT(id))
{
case EQFRONT:
if(pQ->empty()) return JS_FALSE;
*vp = INT_TO_JSVAL( pQ->front() );
break;
case EQBACK:
if(pQ->empty()) return JS_FALSE;
*vp = INT_TO_JSVAL( pQ->back() );
break;
case EQSIZE:
*vp = INT_TO_JSVAL( pQ->size() );
break;
case EQEMPTY:
*vp = BOOLEAN_TO_JSVAL( pQ->empty() );
break;
case EQARRAY: //数组操作
{
//用JS_NewArrayObject生成数组
JSObject *objA = JS_NewArrayObject(cx, 0, NULL);
jsint idx = 0;
for(std::deque<int>::iterator itr=pQ->begin(); itr!=pQ->end(); ++itr)
{
jsval v = INT_TO_JSVAL(*itr);
//用JS_SetElement加入指定索引的数据
JS_SetElement(cx, objA, idx++, &v);
}
*vp = OBJECT_TO_JSVAL(objA);
break;
}
break;
}
return JS_TRUE;
}
// "构造"
JSBool MyClassConstructor(JSContext *cx, JSObject *obj, uintN argc,
jsval *argv, jsval *rval)
{
std::deque<int> *pQ = new std::deque<int>();
JS_SetPrivate(cx, obj, pQ);
return JS_TRUE;
}
// "析造"
void MyClassDestructor(JSContext *cx, JSObject *obj)
{
std::deque<int>* pQ = (std::deque<int>*)JS_GetPrivate(cx, obj);
delete pQ;
}
******************************************class template*****************************************
// 定义类
JSClass myClass={
"MyClass", // name
JSCLASS_HAS_PRIVATE, // tags
JS_PropertyStub, JS_PropertyStub, // 添加、删除属性的回调 默认是 JS_PropertyStub
MyClassGetter, JS_PropertyStub, // get set方法
JS_EnumerateStub, // 遍历属性
JS_ResolveStub, // 解析不存在的属性
JS_ConvertStub, // 转成原子类型
MyClassDestructor // 析构函数
};
*******************************************class的函数表***************************************
// 类方法
JSBool QPush(JSContext *cx, JSObject *obj, uintN argc,
jsval *argv, jsval *rval)
{
std::deque<int>* pQ = (std::deque<int>*)JS_GetPrivate(cx, obj);
if(JSVAL_IS_INT(argv[0]))
{
pQ->push_back(JSVAL_TO_INT(argv[0]));
}
return JS_TRUE;
}
JSBool QPop(JSContext *cx, JSObject *obj, uintN argc,
jsval *argv, jsval *rval)
{
std::deque<int>* pQ = (std::deque<int>*)JS_GetPrivate(cx, obj);
if(!pQ->empty())
{
pQ->pop_front();
}
return JS_TRUE;
}
JSFunctionSpec myClassMethod[]={
JS_FS("push", QPush, 1, 0, 0), // 依次是name, notive func, argc, tags, extra
JS_FS("pop", QPop, 0, 0, 0),
JS_FS_END
};
*****************************************JS_InitClass****************************
JSObject * newobj = JS_InitClass(cx, objParent, NULL, // cx, global obj, prototype,
&myClass, MyClassConstructor, 0, // 类构成模板,构造函数,构造函数参数个数
NULL, myClassMethod, // prototype中的属性和方法
NULL, NULL); // 构造函数的属性和方法
**************************************JS_DefineProperties************************
JSPropertySpec myClassProp[]={
{"front", EQFRONT, JSPROP_READONLY}, // names, c实现中的唯一id, flags, get函数, set函数
{"back", EQBACK, JSPROP_READONLY},
{"size", EQSIZE, JSPROP_READONLY},
{"empty", EQEMPTY, JSPROP_READONLY},
{"array", EQARRAY, JSPROP_READONLY},
{0}
};
JS_DefineProperties(cx, newobj, myClassProp);
发表评论
-
antd的默认配置
2021-01-11 15:32 350antd pro的默认配置 1、connect的时候需要把 ... -
camunda 源代码解析(一)
2020-03-06 17:53 3041壹 基本概念 一、任 ... -
spring cloud gateway 分析一 主流程和层次
2020-02-14 19:27 564一、debug的调用栈如下: DispatcherHand ... -
B端产品学习笔记
2018-12-01 22:25 807B端产品学习笔记 一、B端产品分类:协作办公 即时通讯 企 ... -
大数据、数据仓库和ETL
2018-07-27 20:50 4392一、背景 大量原来线下的业务电子化之后,产生了 ... -
单机与分布式的组件差异
2018-07-25 15:51 716一、单机程序 1、用内存进程队列实现解耦合和异步 ... -
大数据数据仓库 《大数据之路:阿里巴巴大数据实践》 读书笔记
2018-07-17 18:11 860一、基本概念 1 ... -
ElasticSearch 三 建立索引快的原因
2018-07-09 18:02 838https://blog.csdn.net/u010994 ... -
ElasticSearch 二 查询快的原因
2018-07-09 17:25 2470https://www.jianshu.com/p/ ... -
ElasticSearch 一 基本概念
2018-07-09 17:22 5081、Indices 索引,类似于mysql的Database ... -
后端技术的演化
2018-01-05 18:04 565一、应用分类: 数据库交易类、数据处理(大数据、机器学习、 ... -
pandas 小技巧
2018-01-05 17:34 5951、筛选数据 complaints[['Complaint ... -
区块链技术概览
2017-12-05 16:47 1546区块链技术概览 一、 ... -
区块链技术概览
2017-12-05 16:44 23写道 区块链技术概览 ... -
c++以太坊编译
2017-12-04 16:22 742c++以太坊编译 https://github.com/ ... -
编译solc
2017-12-01 17:27 3660git clone https://github.com/ ... -
深度学习思考和理解 一 统计学和信息论
2017-09-18 11:00 8701、世界是不确定的,所有的函数表达式y=f(x) 只在理论中 ... -
基于camunda的工作流开发
2017-07-11 09:21 14905一、定义 工作流(Wor ... -
数据挖掘概览
2017-06-30 17:22 576数据、信息、知识、智 ... -
服务端相关技术总结
2017-06-16 10:38 440服务端相关技术总结 在实际产品中,主要涉及到的计算 ...
相关推荐
集成SpiderMonkey到VC++项目中,你需要: 1. 添加`js32.dll`作为项目的依赖项,确保在运行时能找到这个库。 2. 引入`jsapi.h`,这样你的C++代码就可以调用JavaScript引擎的接口。 3. 使用`JS_NewContext`函数创建一...
1. **即时编译(JIT)技术**:SpiderMonkey 1.6 集成了先进的即时编译技术,将 JavaScript 代码转换为机器码,显著提升了执行速度。这种技术使得 JavaScript 能够接近甚至超越某些静态编译语言的性能。 2. **垃圾...
**SpiderMonkey 31.2.0 开发包详解** SpiderMonkey是Mozilla公司为JavaScript编程语言开发的一个开源、高性能的JavaScript引擎。它以其强大的解析、编译和执行能力,为Web浏览器、服务器、桌面应用程序等多个场景...
总结来说,"spidermonkey_js32.zip"是一个包含32位SpiderMonkey 1.6 release版本的压缩包,它提供了.dll和.lib文件以便在Windows系统上运行和集成JavaScript引擎。这个版本适用于编译像mp4box这样的项目,展示了...
工程实例可能是一个演示如何在Dev-C++中使用SpiderMonkey API的简单项目,这对于学习如何将SpiderMonkey集成到C++项目中非常有帮助。 在实际应用中,例如开发浏览器或者游戏引擎,SpiderMonkey可以被用来执行网页...
**Spider Monkey与...通过以上步骤,你已经成功地在CodeBlocks中集成了Spider Monkey,并编写了一个简单的示例。继续深入学习,你将能够充分利用Spider Monkey的灵活性和强大功能,为你的C++应用增添动态脚本支持。
SpiderMonkey的JSAPI为C/C++开发者提供了一个强大的工具集,使他们能够无缝地集成JavaScript到自己的应用程序中。通过理解和熟练使用这些API,开发者可以构建功能丰富的跨平台应用,利用JavaScript的灵活性和动态...
1. 如何在项目中集成SpiderMonkey库。 2. API参考,介绍如何调用和操作JavaScript引擎的功能。 3. 示例代码,展示如何执行JavaScript代码、创建对象、调用函数等。 4. 调试技巧,帮助开发者定位和修复问题。 5. 性能...
"js32.lib" 可能是一个静态链接库,用于在C或C++程序中集成SpiderMonkey JavaScript引擎。 **SpiderMonkey详解** SpiderMonkey是最早的JavaScript引擎之一,自1998年起由Mozilla基金会开发。它的设计目标是提供...
对于SpiderMonkey for Objectel Extensions来说,这个"bin"目录很可能包含了集成SpiderMonkey引擎后的Objectel扩展程序的执行文件,或者是用于初始化和配置扩展的工具。用户或开发者可以通过运行这些二进制文件来...
在具体实现上,DCS组态软件首先需要集成SpiderMonkey引擎。这通常涉及到引擎的编译、链接和配置工作,确保引擎能够在DCS软件环境中正常工作。接着,软件开发者需要创建一个接口,使得用户可以通过这个接口编写和调用...
SpiderMonkey.jl包将SMOA算法集成到Julia环境中,为用户提供了一套简洁的接口来解决优化问题。该包可能包含以下功能: 1. 函数接口:用户可以定义自己的目标函数,并通过调用特定的函数来启动优化过程。 2. 参数...
SpiderMonkey与Firefox浏览器的其他组件紧密集成,比如DOM解析器和CSS样式引擎,共同构成了强大的Web平台。它支持Web Workers,使得JavaScript可以利用多核处理器进行并行计算,提升Web应用的性能。同时,通过WebGL...
总的来说,这个JS_1.7.0 SpiderMonkey资源库为那些希望在C或C++项目中集成JavaScript功能的开发者提供了便利,尤其是在需要兼容老版本系统或工具的情况下。然而,对于新项目,建议考虑使用更新的JavaScript引擎以...
使用的引擎是Mozilla SpiderMonkey引擎( )。 这个项目起初是我学习防锈的业余爱好项目。我希望你们中的一些人发现对从锈病中使用蜘蛛猴很有帮助。 状态 尚无生产准备就绪,未经测试... 从0.2.0版开始,它可与最新...
SpiderMonkey是Mozilla公司开发的一个JavaScript引擎,它是Firefox浏览器内核的一部分,负责解析和执行JavaScript代码。 "js32.dll" 和 "js32.lib" 是与SpiderMonkey 1.6版本相关的动态链接库(Dynamic Link ...
SpiderMonkey引擎可以轻松地与C++语言集成,从而实现JavaScript引擎的功能。 在测试中,我们使用了SpiderMonkey引擎来提取动态URL,结果表明JavaScript引擎可以成功地提取动态URL,并提高网页采集的效率和准确性。 ...
SpiderMonkey不仅支持标准的ECMAScript规范,还支持一些非标准但实用的扩展特性,如`eval()`、`with`语句等。它具有以下特点: - **开源**:任何人都可以查看其源代码,并对其进行修改和改进; - **灵活**:可以很...
另一个重要的引擎是SpiderMonkey,它是Mozilla Firefox的一部分,由Mozilla开发。还有Chakra,这是微软Edge浏览器的引擎,现在主要应用于Microsoft的服务器端JavaScript平台,如Azure Functions。 在JavaScript引擎...
更新内容: Social API 开始支持多个服务提供商 增强的 DNT(Do Not Track) 选项界面,提供三种选择 ...从 Spidermonkey 中去掉 E4X 支持 在 Firefox 中集成了 add-on SDK 的 API 新增 <main> 元素和 scoped 样式支持