簡體   English   中英

嵌入式 V8 上下文和腳本編譯崩潰

[英]Embedded V8 context and script compilation crash

呼吁 V8 專家。 我將 V8 嵌入到我的一個項目中,並且遇到了模塊化代碼的問題。 最簡單的例子是編譯和運行一個打印“Hello World!”的小腳本。 來自 C++ 函數。 工作版本如下:

void testV8(const v8::FunctionCallbackInfo<v8::Value>& args) {
    printf("Hello World!\n");
}

void working() {
    v8::Isolate* isolate = nullptr;
    std::string code = "testV8();";

    {
        // Basic initialization
        std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
        v8::V8::InitializePlatform(platform.get());
        v8::V8::Initialize();
        v8::Isolate::CreateParams initOptions;
        initOptions.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator();
        isolate = v8::Isolate::New(initOptions);
        isolate->Enter();

        // Create context
        v8::HandleScope handleScope(isolate);
        auto global = v8::ObjectTemplate::New(isolate);
        v8::Local<v8::Context> context = v8::Context::New(isolate, nullptr, global);

        // Enter context
        v8::Context::Scope contextScope(context);

        // Bind function
        v8::Local<v8::FunctionTemplate> ft = v8::FunctionTemplate::New(isolate, &testV8);
        auto name = v8::String::NewFromUtf8(isolate, "testV8").ToLocalChecked();
        context->Global()->Set(context, name, ft->GetFunction(context).ToLocalChecked());

        // Run script
        auto execCode = v8::String::NewFromUtf8(isolate, code.c_str()).ToLocalChecked();
        v8::Local<v8::Script> script;
        if (v8::Script::Compile(context, execCode).ToLocal(&script)) {
            v8::Local<v8::Value> result;
            script->Run(context).ToLocal(&result);
        }
    }
}

當我嘗試將代碼拆分為可管理的范圍時(模仿我稍后要構建的包裝類),我在腳本編譯時崩潰:

void testV8(const v8::FunctionCallbackInfo<v8::Value>& args) {
    printf("Hello World!\n");
}

void failing() {
    v8::Isolate* isolate = nullptr;
    std::string code = "testV8();";
    v8::Persistent<v8::Context> persistentContext;

    {
        // Basic initialization
        std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
        v8::V8::InitializePlatform(platform.get());
        v8::V8::Initialize();
        v8::Isolate::CreateParams initOptions;
        initOptions.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator();
        isolate = v8::Isolate::New(initOptions);
        isolate->Enter();

        // Create context
        v8::HandleScope handleScope(isolate);
        auto global = v8::ObjectTemplate::New(isolate);
        v8::Local<v8::Context> context = v8::Context::New(isolate, nullptr, global);

        // Save context
        persistentContext.Reset(isolate, context);
    }

    {
        // Rebuild scopes and enter context
        v8::Locker locker(isolate);
        v8::HandleScope handleScope(isolate);
        v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, persistentContext);
        v8::Context::Scope contextScope(context);

        // Bind function
        v8::Local<v8::FunctionTemplate> ft = v8::FunctionTemplate::New(isolate, &testV8);
        auto name = v8::String::NewFromUtf8(isolate, "testV8").ToLocalChecked();
        context->Global()->Set(context, name, ft->GetFunction(context).ToLocalChecked());
    }

    {
        // Rebuild scopes and enter context
        v8::Locker locker(isolate);
        v8::HandleScope handleScope(isolate);
        v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, persistentContext);
        v8::Context::Scope contextScope(context);

        // Run script
        auto execCode = v8::String::NewFromUtf8(isolate, code.c_str()).ToLocalChecked();
        v8::Local<v8::Script> script;
        if (v8::Script::Compile(context, execCode).ToLocal(&script)) {
            v8::Local<v8::Value> result;
            script->Run(context).ToLocal(&result);
        }
    }
}

在 xCode 上構建並在 Macbook 上運行此代碼。 我不知道我是否做錯了什么,或者上下文是否存在一些錯誤。 在線研究使我相信,以這種方式使用持久上下文可以在范圍之間保持相同的上下文。 這里出了什么問題?

問題是一旦范圍結束,平台的 unique_ptr 就會被破壞。 將它移動到父作用域可以修復它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM