Как правильно повторно использовать global_object с несколькими v8::Context s?

Я рефакторинг моего V8 с реализацией OpenGL и застрял с проблемой в контексте выполнения.

Концепция заключается в следующем:

  • V8GL::initialize()Этот метод инициализирует контекст и глобальный шаблон. Он также использует контекст для перенасыщения, потому что есть несколько работающих циклов, которые также открыты для контекста JS. (например glut.mainLoop())

  • V8GL::execute(context, source, url)Этот метод в основном выполняет строку внутри данного контекста. Я думаю, что так должно быть для последующего использования изолятов с интервалами / тайм-аутами.

Что не работает:

V8GL::initialize() также прикрепляет встроенные файлы JavaScript и выполняет их. Это прекрасно работает.

Упрощенный код:

V8GL::initialize(...) {
    v8::Persistent<v8::Context> context = v8::Context::New(NULL, globalTemplate);
    v8::Context::Scope context_scope(context);

    // cached for glut mainLoop etc.
    GlutFactory::context_ = v8::Persistent<v8::Context>::New(context);

    execute(context, v8::String::New(...script content...), v8::String::New(...script url path to show for exception stacktraces...);


    // after all the stuff was dispatched to the global context, I want to cache the global object for later usage.
    v8gl::global = v8::Persistent<v8::Object>::New(context->Global());
    context->DetachGlobal();
    context.Dispose();

}

V8GL::execute(context, source, filename) {

    v8::HandleScope scope;
    // Previously, I had v8::Context::Scope(context) in here.
    v8::Local<v8::Script> script = v8::Script::Compile(source, filename);

}

Эта проблема:

Это была инициализация. Это отлично работает, поэтому материал из моих собственных библиотек доступен в исполнении JavaScript. НО я хотел выполнить другой файл, который передается через аргумент. Так что main.cpp's main() выглядит так

int main(...) {

    v8gl::V8GL::initialize(&argc, argv); // argc and argv required for glut.

    v8::HandleScope scope;
    // This doesn't work:
    // v8::Local<v8::Context> context = v8::Context::GetCurrent();

    // You can't pass NULL as second parameter, so what then?
    v8::Context::New(NULL, v8::ObjectTemplate::New(), v8gl::global);

    // In here, all globals are lost. Why?
    v8gl::V8GL::execute(context, source, filepath);

}

Вопросы:

  • Нужно ли кэшировать объектный шаблон глобальной для использования с v8::Context::New()?
  • Глобальный_объект должен быть постоянным или локальным?
  • Как я могу использовать это снова? DetachGlobal() а также ReattachGlobal() материал работал только с одним контекстом, а не с несколькими. В моем случае требуется несколько контекстов.

0 ответов

Другие вопросы по тегам