C++范围和Google V8脚本上下文

pis*_*hio 4 c++ scope v8 embedded-v8 libv8

我有以下几乎用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);
}

[..]
Run Code Online (Sandbox Code Playgroud)

我有函数setupJs()设置v8环境,callJs应该被多次调用(工作时,javascript脚本每次增加一个var).

如果我放

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);
Run Code Online (Sandbox Code Playgroud)

在setupJs中,我可以看到如何调用函数s和"1".但是如果我使用不同的函数离开函数调用以便稍后调用,那么我在该行上有一个SegfaultHandle<Value> js_result = jsUpdateFunc->Call(jsGlobal, 0, args);

我已经检查过,jsUpdateFunc和jsGlobal都是非空指针

Bit*_*tex 6

你需要使用持久句柄jsGlobaljsUpdateFunc.正常(本地)句柄在其封闭v8::HandleScope被破坏时变为无效.

你还需要一个v8::Isolate指针的全局变量和另一个用于指针的持久句柄v8::Context.

要在以后调用脚本函数,您需要:

  1. 锁定隔离物(你真的应该这样做setupJs;看看v8::Locker)
  2. 输入隔离物(参见参考资料v8::Isolate::Scope).
  3. 建立句柄范围(请参阅参考资料v8::HandleScope).
  4. 为上下文创建本地句柄.
  5. 输入上下文(请参阅v8::Context::Scope).
  6. jsGlobal和创建本地句柄jsUpdateFunc.
  7. 如上所述调用脚本函数.

v8::Persistent在V8头文件中查找和相关模板.