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

时间:2014-02-09 23:59:23

标签: c++ node.js v8 embedded-v8 libuv

这是一个node.js插件模块,我用C ++编写,使用node-gyp构建。 当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", StoreFunction);
  NODE_SET_METHOD(target, "InvokeFunction", InvokeFunction);
}

NODE_MODULE(someaddonmodule, init);

当然还有一些叫js ...........

var myaddon = require('../build/Release/someaddonmodule');
myaddon.StoreFunction(function(data){   
    console.log("Called back: "+data);
});

myaddon.InvokeFunction();   //causes a segmentation fault

1 个答案:

答案 0 :(得分:3)

答案是因为我们不再使用Java编写Toto。 我创建的指针指向Local Handle,而不是函数。持有'引用'是不足以阻止V8垃圾收集在范围关闭时销毁它。

为了解决这个问题,需要向V8发出一个明确的请求,要求保留一些内存 这样做的功能:

Persistent< Function > percy;
Local<Function> callbackFunction = Local<Function>::Cast(args[0]);
percy = Persistent<Function>::New(callbackFunction);

如果对V8内部有更好理解的人知道的不止于此,我仍然非常希望听到您的解释:)