5

私は次の、C ++で書かれたほとんど機能するコードを持っています:

[..]

Handle<Object> jsGlobal;
Handle<Function> jsUpdateFunc;

void setupJs () {
    V8::Initialize();
    Isolate* isolate = v8::Isolate::New();
    Isolate::Scope isolate_scope(isolate);
    HandleScope handle_scope(isolate);
    Local<Context> context = Context::New(isolate);
    Context::Scope context_scope(context);
    Local<String> source = String::NewFromUtf8(isolate, "var a = 0; function test() { a++; return a.toString(); }");
    Local<Script> script = Script::Compile(source);
    script->Run();

    jsGlobal = context->Global();
    Handle<Value> value = jsGlobal->Get(String::NewFromUtf8(isolate, "test"));
    jsUpdateFunc = Handle<Function>::Cast(value);
}

void callJs() {
    Handle<Value> args[0];
    Handle<Value> js_result = jsUpdateFunc->Call(jsGlobal, 0, args);
    js_result->ToString();

    String::Utf8Value utf8(js_result);
    printf("%s\n", *utf8);
}

[..]

関数 setupJs() で v8 環境をセットアップし、callJs が複数回呼び出されることになっています (作業中、javascript スクリプトは毎回 var a を 1 ずつインクリメントします)。

私が入れたら

Handle<Value> args[0];
Handle<Value> js_result = jsUpdateFunc->Call(jsGlobal, 0, args);
js_result->ToString();

String::Utf8Value utf8(js_result);
printf("%s\n", *utf8);

setupJs では、関数がどのように呼び出され、「1」が出力されるかを確認できます。しかし、後で呼び出される別の関数を関数呼び出しのままにしておくと、その行に Segfault が発生しますHandle<Value> js_result = jsUpdateFunc->Call(jsGlobal, 0, args);

私が確認したところ、jsUpdateFunc と jsGlobal の両方が非 null ポインターです。

4

1 に答える 1