【问题标题】:C++ scope and Google V8 script contextC++ 范围和 Google V8 脚本上下文
【发布时间】:2015-10-16 11:02:42
【问题描述】:

我有以下用 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 递增一)。

如果我放

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”是如何打印的。但是,如果我将函数调用留给稍后调用的不同函数,我会在 Handle&lt;Value&gt; js_result = jsUpdateFunc-&gt;Call(jsGlobal, 0, args); 行出现 Segfault

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

【问题讨论】:

    标签: c++ scope v8 embedded-v8 libv8


    【解决方案1】:

    您需要为jsGlobaljsUpdateFunc 使用持久句柄。普通(本地)句柄在其封闭的v8::HandleScope 被销毁时变得无效。

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

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

    1. 锁定隔离区(您也应该在 setupJs 中执行此操作;请参阅 v8::Locker
    2. 输入隔离(见v8::Isolate::Scope)。
    3. 建立句柄范围(参见v8::HandleScope)。
    4. 为上下文创建一个本地句柄。
    5. 输入上下文(参见v8::Context::Scope)。
    6. jsGlobaljsUpdateFunc 创建本地句柄。
    7. 如上调用脚本函数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      相关资源
      最近更新 更多