- 浏览: 235056 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 268antd pro的默认配置 1、connect的时候需要把 ... -
camunda 源代码解析(一)
2020-03-06 17:53 2570壹 基本概念 一、任 ... -
spring cloud gateway 分析一 主流程和层次
2020-02-14 19:27 489一、debug的调用栈如下: DispatcherHand ... -
B端产品学习笔记
2018-12-01 22:25 764B端产品学习笔记 一、B端产品分类:协作办公 即时通讯 企 ... -
大数据、数据仓库和ETL
2018-07-27 20:50 4336一、背景 大量原来线下的业务电子化之后,产生了 ... -
单机与分布式的组件差异
2018-07-25 15:51 664一、单机程序 1、用内存进程队列实现解耦合和异步 ... -
大数据数据仓库 《大数据之路:阿里巴巴大数据实践》 读书笔记
2018-07-17 18:11 818一、基本概念 1 ... -
ElasticSearch 三 建立索引快的原因
2018-07-09 18:02 789https://blog.csdn.net/u010994 ... -
ElasticSearch 二 查询快的原因
2018-07-09 17:25 2400https://www.jianshu.com/p/ ... -
ElasticSearch 一 基本概念
2018-07-09 17:22 4651、Indices 索引,类似于mysql的Database ... -
后端技术的演化
2018-01-05 18:04 514一、应用分类: 数据库交易类、数据处理(大数据、机器学习、 ... -
pandas 小技巧
2018-01-05 17:34 5431、筛选数据 complaints[['Complaint ... -
区块链技术概览
2017-12-05 16:47 1345区块链技术概览 一、 ... -
区块链技术概览
2017-12-05 16:44 23写道 区块链技术概览 ... -
c++以太坊编译
2017-12-04 16:22 657c++以太坊编译 https://github.com/ ... -
编译solc
2017-12-01 17:27 3607git clone https://github.com/ ... -
深度学习思考和理解 一 统计学和信息论
2017-09-18 11:00 8331、世界是不确定的,所有的函数表达式y=f(x) 只在理论中 ... -
基于camunda的工作流开发
2017-07-11 09:21 14708一、定义 工作流(Wor ... -
数据挖掘概览
2017-06-30 17:22 522数据、信息、知识、智 ... -
服务端相关技术总结
2017-06-16 10:38 385服务端相关技术总结 在实际产品中,主要涉及到的计算 ...
相关推荐
《用perl解析JavaScript之JavaScript模块的安装--SpiderMonkey》 安装依赖软件: 安装pyrex:sudo apt-get install python-pyrex 安装g++:sudo apt-get install g++ 安装libjs.so: $ tar zxvf js-1.7.0.tar...
C++ js 互相调用 spider monkey
spiderMonkey JS源代码 OpenVXI开发中使用
SpiderMonkey是Mozilla项目的一部分,是一个用C语言实现的JavaScript脚本引擎。这是编译好的,直接可以用,是截止2015/1/28最新的稳定版31.2.0。
Mozilla网络太慢了,抓取了SpiderMonkey的API网站的页面,整理而成,不依赖网络快速查找API!
spidermonkey 1.6,包含dll和lib,release版本。 编译mp4box可以用。
使用mozilla的SpiderMonkey技术。实现自定义对象的解析和运行Demo
C语言编写的Firefox的Javascript引擎,Firefox3.0以前的Javascript引擎都是用SpiderMonkey的,3.1之后引入了TraceMonkey,但目前还没找到它的源码,希望找到的兄弟们发上来,谢谢。
在Windows系统编译制作SpiderMonkey包.pdf
SpiderMonkey is Mozilla's JavaScript engine written in C/C++. It is used in various Mozilla products, including Firefox, and is available under the MPL2.
SpiderMonkey 1.6和1.7 win32下编译文件,包含.lib,js32.dll,jsapi.h等全部所需文件,并包含一个dev-c++工程实例
SpiderMonkey-JS引擎,msvc6编译的js引擎!供大家使用!
firefox的javascript1.6版本的引擎源代码
java运行所需引擎,win10环境vs2015编译,c++用来运行java脚本,版本不同无法使用,jsc反编译也要看版本
Firefox 下面的强大的脚本解释引擎及安装使用,具体安装步骤请见压缩包里的README
通过MOZILLA的javascript引擎(SpiderMonkey)执行js代码
spidermonkey.dev 静态内容 该网站是一个登录页面,连接到对Mozilla SpiderMonkey JavaScript Engine或与Mozilla SpiderMonkey JavaScript Engine一起工作的人员有用的资源。 注意:文档本身应尽可能保留在树中,...
但其实这个操作的内部实现(引擎实现)并不是你想象的那么简单.SpiderMonkey中一共使用过两种函数序列化的技术:一种是利用反编译器(decompiler)将函数编译后的字节码反编译成源码字符串,另一种是在将函数编译成字节码...
esvalid.isValid(node) :: Spidermonkey AST节点→布尔值 当且仅当给定的AST节点表示有效的ECMAScript程序时,才返回true。 esvalid.isValid[removed]node) :: Spidermonkey AST节点→布尔值 当且仅当给定的AST节点...
spidermonkey-让你的c程序支持javascript脚本.docx