我试图在调用 c++ 回调时调用已注册的 JS 函数,但我得到了一个段错误,因为我认为这是一个范围问题。
Handle<Value> addEventListener( const Arguments& args ) {
HandleScope scope;
if (!args[0]->IsFunction()) {
return ThrowException(Exception::TypeError(String::New("Wrong arguments")));
}
Persistent<Function> fn = Persistent<Function>::New(Handle<Function>::Cast(args[0]));
Local<Number> num = Number::New(registerListener(&callback, &fn));
scope.Close(num);
}
当事件发生时,将调用以下方法。我假设这可能发生在 V8 正在执行 JS 的另一个线程上。
void callback(int event, void* context ) {
HandleScope scope;
Local<Value> args[] = { Local<Value>::New(Number::New(event)) };
Persistent<Function> *func = static_cast<Persistent<Function> *>(context);
(* func)->Call((* func), 1, args);
scope.Close(Undefined());
}
这会导致分段错误: 11. 请注意,如果我使用 addEventListener() 中对 Persistent 的引用直接调用回调函数,它会正确执行该函数。
我假设我需要一个储物柜或隔离?看起来 libuv 的 uv_queue_work() 也可以解决这个问题,但是由于我没有启动线程,所以我看不出你会如何使用它。