Articles of embedded v8

V8 Javascript引擎:v8 ::参数和函数模板

我包装了一个C ++标准库std::map<T1,T2> ,我想作为一个Node.JS插件公开。 我想要有两个函数,一个是为哈希表添加一个新的值,另一个是从地图上查找值。 我想要一个适用于“任意”types的函数。 这意味着Get必须从Args[0]提取typesT1值(请注意, Args是v8::Argumentstypes的)。 请参阅下面的代码。 template<typename T1, typename T2> class Hash : public node::ObjectWrap { public: static v8::Persistent<v8::FunctionTemplate> constructor; static void Init(v8::Handle<v8::Object> target); protected: /* … */ static v8::Handle<v8::Value> New(const v8::Arguments& Args); // new object static v8::Handle<v8::Value> Set(const v8::Arguments& Args); // set H[x]=y static v8::Handle<v8::Value> Get(const v8::Arguments& Args); // return H[x] private: […]

Google的v8引擎与C + + 11

可以V8(Google的开源JavaScript引擎)与C ++ 11一起使用吗?

node.js的v8扩展 – 无法将FunctionTemplate设置为目标

我刚刚开始通过v8扩展(根据Node.JS文档和v8 API文档的说明 )编写一个绑定到C库(准确地说是链接语法)。 我的问题是,我得到以下的生成错误: /usr/include/v8.h: In constructor âv8::Handle<T>::Handle(v8::Handle<S>) [with S = v8::FunctionTemplate, T = v8::Value]â: node.cc:85:68: instantiated from here /usr/include/v8.h:195:5: error: cannot convert âv8::FunctionTemplate*â to âv8::Value* volatileâ in assignment …当试图build立下面的代码: #include <v8.h> #include <locale.h> #include <stdio.h> #include <stdlib.h> #include "link-includes.h" using namespace v8; Dictionary dict; Parse_Options opts; static Handle<Value> v8parse(const Arguments& args) { /* snip […]

调用处理程序数据的垃圾回收

我试图提供数据给函数调用处理程序,但我无法正确地收集垃圾。 如果我注释掉包含“ tpl->SetCallHandler(callFn, external); ”的行,则调用ObjWeakCallback 。 该函数从来没有被收集,但(至lessFnWeakCallback从来没有被调用,不pipe是什么)。 请注意,静态数据不是一个选项,因为这需要准备好每个进程的多个隔离。 isolate->setData也不是一个选项。 我完全错过了什么吗? 在v8::Function存储数据的正确方法是什么? 编辑:让我重新说明这个问题,以更好地描述我的意图… 我想创build一个函数模板(因为我需要使用它作为JS端的构造函数)。 我需要一些方法来发送一个void *给它的调用处理程序,但是这个数据必须是垃圾回收。 关于我到目前为止一直在尝试的一些笔记: 使用Function::New(isolate, callHandler, External::New(isolate, data))工作,但不提供JS端构造函数的function(对于创build的对象不可能用SetInternalFieldCount) FunctionTemplate::New(isolate, callHandler, External::New(isolate, data))提供了将数据传递给调用处理程序的能力,但是从不被垃圾回收(下面的工作示例) 我尝试使用一个普通的函数,并返回一个新创build的Object ,但接下来的假设new Fn() instanceof Fn失败 #include <v8.h> #include <iostream> // made static, just to simplify the example and prevent crashes // the persistents would normally be wrapped inside a "baton" together […]

使指向已删除的C ++对象的句柄无效

当暴露给v8的C ++对象被删除时,我怎样才能使可能指向这个对象的句柄失效。 我正在使用v8作为一个更大的应用程序的脚本接口。 更大的应用程序中的对象在v8中使用节点的ObjectWrap类进行封装和访问。 问题是,包装对象的生命周期是有限的。 如果在JavaScript中,我执行如下所示: var win = app.getWindow(); win.close(); // The C++ object that win references goes away console.log(win.width()); // This should fail. 我希望它的行为就像评论说的那样。 在win.close()之后(或者其他一些事件也许在JS控制之外),任何对win或者duplicate处理的访问都需要失败。 目前,我必须将封装的C ++对象标记为无效,并检查每个方法调用的有效性。 这是做到这一点的唯一方法,还是有办法标记一个不再有效的句柄?

如何从C ++调用JavaScriptcallback

我试图从我的函数的另一个angular度调用V8中的callback。 所以这段代码注册callback: if (args.Length()) { String::Utf8Value event(args[0]->ToString()); if (event.length()) { Isolate* isolate = V8Interface::getCurrent()->getIsolate(); Locker locker(isolate); HandleScope scope(isolate); callback cb = callback(isolate, Local<Function>::Cast(args[1])); if(!events.count(*event)) { events[*event] = callbacks({ cb }); } else { events.find(*event)->second.push_back(cb); } } } 这个叫它: void trigger(std::string event) { Isolate* isolate = V8Interface::getCurrent()->getIsolate(); Locker locker(isolate); HandleScope scope(isolate); if(events.count(event)) { for(callback cb : […]

如何存储对函数的引用,以便稍后在node.js C ++插件模块中调用它?

这里是我用C ++编写的node.js插件模块,使用node-gyp构build。 当StoreFunction我试图存储一个指向函数的指针,所以我可以稍后使用它 当我尝试稍后通过InvokeFunction调用它时,出现Segmentation错误。 如果我在两个函数(使用cout)中检查指针,我感到困惑,它们是相同的值。 所以我猜测调用两个函数之间调用上下文更改的变化,或者我不明白我指的是什么。 所有(ummmmmm)指针感激地收到我的问题在这里………….. #include <node.h> #include <v8.h> using namespace v8; v8::Persistent<v8::Function> callbackFunction; Handle<Value> StoreFunction(const Arguments& args) { HandleScope scope; callbackFunction = *Local<Function>::Cast(args[0]); return scope.Close(Undefined()); } Handle<Value> InvokeFunction(const Arguments& args) { HandleScope scope; Local<Value> argv[1] = { String::New("Callback from InvokeFunction")}; callbackFunction->Call(Context::GetCurrent()->Global(), 1, argv); return scope.Close(Undefined()); } void init(Handle<Object> target) { NODE_SET_METHOD(target, "StoreFunction", […]

node.js插件上未定义的符号

我正在尝试创build一些node.js插件。 在插件里面我有一个静态库的调用。 一切编译好,但是当我从JavaScript调用我的插件function,我得到以下内容: module.js:356 Module._extensions[extension](this, filename); ^ Error: /home/…/Projects/NodeAddonComLibTest/build/Debug/addon.node: undefined symbol: _Z6ctest1Pi at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.require (module.js:364:17) at require (module.js:380:17) at Object.<anonymous> (/home/…/Projects/NodeAddonComLibTest/doTest.js:1:75) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Function.Module.runMain (module.js:497:10) 我的插件代码如下: #include <iostream> #include <string.h> #include <stdlib.h> #include <node.h> #include <v8.h> using namespace […]

JavaScript标准库V8

在我的应用程序中,我允许用户使用JavaScript编写插件。 为此我embedded了V8。 问题是开发人员不能使用像HTTP,套接字,stream,定时器,线程,Crypotography,unit testing等等。 我search堆栈溢出,我发现node.js。 它的问题是,你可以真正创build HTTP服务器,并启动进程和更多的东西,我不想让。 另外,node.js有自己的环境( ./node script.js ),你不能embedded它。 而且它不支持Windows – 我需要它是完全跨平台的。 如果这些问题可以解决,那就太棒了:)但是我也对其他框架开放。 有任何想法吗? 谢谢!