Google V8 постоянный контекст - сбой компиляции скрипта - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь использовать один глобальный контекст для последующих исполнений. Когда вызывается функция 1, скрипт возвращает правильное значение. Однако когда я вызываю function2 после этого, Script :: Compile вылетает. Функция 1 является инициализацией v8, поэтому я вызываю ее только один раз.

глобальные переменные:

    Isolate *isolate;
    Persistent<Context> pContext;

код для функции1:

    auto platform = platform::NewDefaultPlatform();
    V8::InitializePlatform(platform.get());
    V8::Initialize();

    Isolate::CreateParams create_params;
    create_params.array_buffer_allocator = ArrayBuffer::Allocator::NewDefaultAllocator();
    isolate = Isolate::New(create_params);

    Locker locker(isolate);

    Isolate::Scope isolate_scope(isolate);
    HandleScope handle_scope(isolate);

    Local<Context> context = Context::New(isolate);
    pContext.Reset(isolate, context);

    Context::Scope context_scope(context);

    Local<Script> script = Script::Compile(context, to_v8(isolate, "'Test'")).ToLocalChecked();

    Local<Value> r = script->Run(context).ToLocalChecked();

    cout << "script result: " << *(String::Utf8Value(isolate, r));

function2:

Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);

Local<Context> context = Local<Context>::New(isolate, pContext);

Local<Script> script = Script::Compile(context, to_v8(isolate, "'Test'")).ToLocalChecked();

Context::Scope context_scope(context);
Local<Value> r = script->Run(context).ToLocalChecked();

cout << "script result: " << *(String::Utf8Value(isolate, r));

Stacktrace, который я получаю:

at v8::internal::Compiler::GetSharedFunctionInfoForScript[v8::internal::Isolate*, v8::internal::Handle<v8::internal::String>, v8::internal::Compiler::ScriptDetails const&, v8::ScriptOriginOptions, v8::Extension*, v8::internal::ScriptData*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason, v8::internal::NativesFlag] (UnknownFile:?)
at v8::ScriptCompiler::CompileUnboundInternal[v8::Isolate*, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason] (UnknownFile:?)
at v8::ScriptCompiler::Compile[v8::Local<v8::Context>, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason] (UnknownFile:?)
at v8::Script::Compile[v8::Local<v8::Context>, v8::Local<v8::String>, v8::ScriptOrigin*] (UnknownFile:?)

to_v8 - это функция для v8 :: String :: NewFromUtf8 ()

1 Ответ

2 голосов
/ 21 марта 2020

Похоже, что это та же проблема, что и Встроенный контекст V8 и компиляция скрипта cra sh: v8::platform::NewDefaultPlatform возвращает std::unique_ptr (чего вы не видите из-за использования auto), поэтому он разрушается, когда выходит из области видимости. Сделайте так, чтобы глобальная переменная и все работало.

Примечание 1: если вы скомпилировали сборку Debug и использовали отладчик, вы сможете сами разобраться с такими проблемами, что сэкономит вам много времени по сравнению необходимость опубликовать вопрос где-нибудь, а затем ждать, пока кто-нибудь придет к ответу.

Примечание 2: Будьте осторожны с auto. Типы имеют смысл; как видно из этого вопроса, их видение (когда они прописаны) помогает избежать ошибок.

...