node 加载内置函数
2013-11-29 19:32
281 查看
部分参考http://hi.baidu.com/brauceunix/item/808e27d00ac3b0d8241f4077
1 入口文件与入口函数
src/node_main.cc->main->node::Start->node.cc:Start //如无特别说X->Y-Z. 这里的X、Y、Z可能是两种情况。一个是C++、Javascript文件名(加后缀的), 其于是各自的函数名. 工具:vim+ctags.
2 src/node.js文件是如何被解释成机器指令的?(lib/*.js也可以走这条路,而像现实世界用的那些个库,也走这个,像express.socketio)
通过v8. src/node.cc->Load函数->ExecuteString->v8::Script::Compile, script->Run
3 像getuid, setuid这些函数如何通过javascript传递给c++,类似这些称为built-in 函数
src/node.cc->SetupProcessObject->NODE_SET_MOETHOD集函数->node::SetMethod
void SetMethod(target_t obj, const char* name,
v8::InvocationCallback callback)
{
obj->Set(v8::String::NewSymbol(name),
v8::FunctionTemplate::New(callback)->GetFunction());
}
初始化的内建模块有process,process有一些绑定的函数,如binding很有用。
然后执行Node.js 文件,里面有个函数NativeModule.require会继续引用一些内置模块
如:NativeModule.require('os'),进而会执行os.js的内置模块,在这个文件中,可以看到导出的函数都是来自
process.binding('os');
然后,我们看Bingding函数, 调用get_builtin_module(*module_v),查找os模块,os在node_extensions中使用NODE_EXT_LIST_ITEM(node_os)定义的,所以找到了;
然后调用 modp->register_func(exports, Undefined());调用os模块的注册函数register_func,它是个函数指针,是在nodeos类文件中使用
NODE_MODULE(node_os, node::OS::Initialize)初始化过的,所以,我们就找到了所有的os的所调用的c++具体的函数。
这个初始化函数只会调用一次,是在binding模块的时候调用;
exports, require, module, __filename, __dirname变量的由来:
NativeModule.prototype.compile中会对源码调用NativeModule.wrap,对源码进行包装,添加
'(function (exports, require, module, __filename, __dirname) { ',
'\n});'
然后eval源码,得到匿名函数fn,然后 fn(this.exports, NativeModule.require, this, this.filename);
所以每个js文件都可以直接使用上面五个变量
更好的一篇:http://blog.cnbang.net/tech/1658/
1 入口文件与入口函数
src/node_main.cc->main->node::Start->node.cc:Start //如无特别说X->Y-Z. 这里的X、Y、Z可能是两种情况。一个是C++、Javascript文件名(加后缀的), 其于是各自的函数名. 工具:vim+ctags.
2 src/node.js文件是如何被解释成机器指令的?(lib/*.js也可以走这条路,而像现实世界用的那些个库,也走这个,像express.socketio)
通过v8. src/node.cc->Load函数->ExecuteString->v8::Script::Compile, script->Run
3 像getuid, setuid这些函数如何通过javascript传递给c++,类似这些称为built-in 函数
src/node.cc->SetupProcessObject->NODE_SET_MOETHOD集函数->node::SetMethod
void SetMethod(target_t obj, const char* name,
v8::InvocationCallback callback)
{
obj->Set(v8::String::NewSymbol(name),
v8::FunctionTemplate::New(callback)->GetFunction());
}
初始化的内建模块有process,process有一些绑定的函数,如binding很有用。
然后执行Node.js 文件,里面有个函数NativeModule.require会继续引用一些内置模块
如:NativeModule.require('os'),进而会执行os.js的内置模块,在这个文件中,可以看到导出的函数都是来自
process.binding('os');
然后,我们看Bingding函数, 调用get_builtin_module(*module_v),查找os模块,os在node_extensions中使用NODE_EXT_LIST_ITEM(node_os)定义的,所以找到了;
然后调用 modp->register_func(exports, Undefined());调用os模块的注册函数register_func,它是个函数指针,是在nodeos类文件中使用
NODE_MODULE(node_os, node::OS::Initialize)初始化过的,所以,我们就找到了所有的os的所调用的c++具体的函数。
这个初始化函数只会调用一次,是在binding模块的时候调用;
exports, require, module, __filename, __dirname变量的由来:
NativeModule.prototype.compile中会对源码调用NativeModule.wrap,对源码进行包装,添加
'(function (exports, require, module, __filename, __dirname) { ',
'\n});'
然后eval源码,得到匿名函数fn,然后 fn(this.exports, NativeModule.require, this, this.filename);
所以每个js文件都可以直接使用上面五个变量
更好的一篇:http://blog.cnbang.net/tech/1658/
相关文章推荐
- Node.textContent Element.innerHTML 还有ie的innerText
- nodejs coffee cluster process execPath
- 一个MapReuce作业的从开始到结束--第4章 DataNode节点启动分析
- 一个MapReuce作业的从开始到结束--第3章 NameNode节点启动分析
- 了不起的Node.js: 将JavaScript进行到底
- 了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发)
- 了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发)
- Node.js is Cancer
- hadoop2.2 single node install
- 《Node.js开发指南》的少许坑儿~
- nodejs产生图片验证码
- ubuntu nodejs 安装
- NodeJS debug on eclipse
- Ubuntu Server 安装 NodeJS
- NodeJS dev environment configure
- nodejs express route 的用法
- nodejs express route 的用法
- C++作业:用节点node表示多项式的系数和次数,编程合并两个链式表达的多项式
- CCSpriteBatchNode 和 CCTextureAtlas 详解
- mac 下 node-qrcode的二维码库