denn
denn

Reputation: 355

A crash on V8' Context::New

I implement a wrapper around the Google V8 engine. I wrote a class:

class Es
{
public:
    Es();
    ~Es();

    int Init(const char* exec_path);

    int CreateContext(uint& id);
    int RemoveContext(const uint id);

protected:
    Global<Context> global_context;
    std::map<uint, Persistent<Context>*> contexts;
    Isolate* isolate = nullptr;

private:
    uint next_id = 1;
};

I want to create Contexts, hold them in the contexts var, and remove them oneday. So, I init the V8 engine:

int Es::Init(const char* exec_path)
{
    v8::V8::InitializeICUDefaultLocation(exec_path);
    v8::V8::InitializeExternalStartupData(exec_path);
    std::unique_ptr<Platform> 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);
    if (!isolate)
        return InitError;

    return Success;
}

And after that I want to create a context, using int Es::CreateContext(uint& id). Its called after Init.

int EasyProspect::CreateContext(uint& id)
{
    if (!isolate)
        return NotInitializedError;

    Isolate::Scope isolate_scope(isolate);
    HandleScope handle_scope(isolate);
    Local<Context> local_context = Context::New(isolate);
    Persistent<Context> context(isolate, local_context);
    contexts.emplace(id, &context);
    return Success;
}

But I can't do that, the code crashes on Context::New(isolate). Why? isolate is not null, I enter the local scope...

Upvotes: 0

Views: 662

Answers (1)

jmrk
jmrk

Reputation: 40561

Your best bet is to compile in Debug mode and run in a debugger. Then it should be easy to tell what's causing the crash.

(At the very least, you should post a complete reproducible example, including specifying the V8 version you're working with, how that's built/configured, and how you're compiling your code.)

If I had to guess: the Platform and the ArrayBuffer::Allocator need to stay alive for as long as you want to use the V8 instance, but in your code they are both destroyed at the end of Es::Init. Since Es is a wrapper class, you can easily add fields there to keep them around.

Upvotes: 2

Related Questions