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() がこれを解決できるように見えますが、スレッドを開始していないため、どのように使用するかわかりません。