9

現在の関数呼び出しだけでなく、将来使用するために、JavaScriptで提供されるコールバックをv8ラップされたオブジェクトにどのように保存しますか。基本的に、C ++でjavascriptオブジェクトを作成したいのですが、new Object()で作成した場合は、関数コールバックを提供します。次に、c++オブジェクトの存続期間を通じてそのコールバックを使用します。以下の例を参照してください。

私が抱えている問題は、Handleオブジェクトを別の静的関数で使用しようとすると、セグメンテーション違反が発生することです。

ノードjsファイル:

var Object = require("./customModule");
var obj = new Object(function(){console.log("Callback called...")})

// Emit callback
obj.emitCallback();

C++モジュールヘッダー内

class Object : public node::ObjectWrap {

public:

    static void Init(v8::Handle<v8::Object> target);

    Object();

protected:

    v8::Handle<v8::Function> m_faceDetectCallback;

    static v8::Handle<v8::Value> New(const v8::Arguments& args);

    static v8::Handle<v8::Value> onEmitCallback(const v8::Arguments& args);
}



v8::Handle<v8::Value> Object::New(const v8::Arguments& args) {

    HandleScope scope;

    Object* obj = new Object();
    obj->Wrap(args.This());

    obj->m_faceDetectCallback = Handle<Function>::Cast(args[0]);

    //obj->m_faceDetectCallback = v8::Persistent<Function>::Cast(args[0]);

    // Works fine here.
    const unsigned argc = 1;
    Local<Value> argv[argc] = { Local<Value>::New(String::New("hello world")) };
    obj->m_faceDetectCallback->Call(Context::GetCurrent()->Global(), argc, argv);

    return args.This();
}

static v8::Handle<v8::Value> Object::onEmitCallback(const v8::Arguments& args){
    HandleScope scope;

    Object* obj = ObjectWrap::Unwrap<Object>(args.This());

    const unsigned argc = 1;
    Local<Value> argv[argc] = { Local<Value>::New(String::New("hello world")) };

        //!! Segfaults here
    if(obj->m_faceDetectCallback->IsCallable()){
        //obj->m_faceDetectCallback->Call(Context::GetCurrent()->Global(), argc, argv);
    }


    return scope.Close(v8::String::New("Start called"));
}
4

1 に答える 1

13

v8::Persistent標準のハンドルの代わりに使用する必要があります。Handleはの基本クラスであるためLocalPersistent実行しているキャストを実行することで、ポインタを取得しますが、v8::FunctionV8にガベージコレクションを行わないように指示することは何も実行しません。

あなたのクラスでこれを使って:

v8::Persistent<v8::Function> m_faceDetectCallback;

と割り当てられた

obj->m_faceDetectCallback = v8::Persistent<v8::Function>::New(args[0]);
于 2012-10-15T16:13:47.293 に答える