В чем причина исключения при создании нового контекста для изолята? - PullRequest
0 голосов
/ 13 февраля 2019

Представленный код выполняется много раз и работает с одним экземпляром переменной (g_creator, g_isolate).При втором вызове этого кода возникает исключение в функции v8 :: Context :: New.Что может быть причиной ошибки?

    v8::StartupData blob;
v8::SnapshotCreator* creator = NULL;
v8::Isolate* isolate = NULL;
if (g_creator && g_isolate)
{
    creator = g_creator;
    isolate = g_isolate;
}
else
{
    blob.data = (const char*)snapshot.data();
    blob.raw_size = snapshot.size();
    creator = new v8::SnapshotCreator(NULL, &blob);
    isolate = creator->GetIsolate();
    g_creator = creator;
    g_isolate = isolate;
}
{   
    v8::HandleScope handle_scope(isolate);
    v8::TryCatch try_catch(isolate);
    v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate);
    v8::Local<v8::Context> context = v8::Context::New(isolate, NULL, global);//Crash!
    v8::Context::Scope context_scope(context);
    creator->SetDefaultContext(context);
    v8::Local<v8::Value> result;
    //...
    v8::Local<v8::String> source =
    v8::String::NewFromUtf8(isolate,
                            methodcall.c_str(),
                            v8::NewStringType::kNormal).ToLocalChecked();

    v8::Local<v8::Script> script;
    if (!v8::Script::Compile(context, source).ToLocal(&script))
    {
        //...
    }
    if (!script->Run(context).ToLocal(&result))
    {
        //...
    }
    else
    {
        //...
    }
}
blob = creator->CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kClear);
//...

Стек:

#0  0x00007ffff779bc07 in v8::internal::Snapshot::NewContextFromSnapshot(v8::internal::Isolate*, v8::internal::Handle<v8::internal::JSGlobalProxy>, unsigned long, v8::DeserializeInternalFieldsCallback)
#1  0x00007ffff71e2722 in v8::internal::Genesis::Genesis(v8::internal::Isolate*, v8::internal::MaybeHandle<v8::internal::JSGlobalProxy>, v8::Local<v8::ObjectTemplate>, unsigned long, v8::DeserializeInternalFieldsCallback, v8::internal::GlobalContextType)
#2  0x00007ffff71c92f7 in v8::internal::Bootstrapper::CreateEnvironment(v8::internal::MaybeHandle<v8::internal::JSGlobalProxy>, v8::Local<v8::ObjectTemplate>, v8::ExtensionConfiguration*, unsigned long, v8::DeserializeInternalFieldsCallback, v8::internal::GlobalContextType) ()
#3  0x00007ffff7182c3f in v8::NewContext(v8::Isolate*, v8::ExtensionConfiguration*, v8::MaybeLocal<v8::ObjectTemplate>, v8::MaybeLocal<v8::Value>, unsigned long, v8::DeserializeInternalFieldsCallback) ()
#4  0x00007ffff7163230 in v8::Context::New(v8::Isolate*, v8::ExtensionConfiguration*
...