6

V8 を OpenGL 実装でリファクタリングしていますが、実行コンテキストの問題で行き詰まりました。

コンセプトは次のとおりです。

  • V8GL::initialize() このメソッドは、コンテキストとグローバル テンプレートを初期化します。また、JS コンテキストにも公開されているいくつかのループが実行されているため、glut のコンテキストも使用します。(例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 は次の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);

}

質問:

  • で使用するために global の objectTemplate をキャッシュする必要がありv8::Context::New()ますか?
  • global_object は永続的またはローカルである必要がありますか?
  • どうすれば再利用できますか?およびはDetachGlobal()ReattachGlobal()複数のコンテキストではなく、単一のコンテキストでのみ機能しました。私の場合、複数のコンテキストが必要です。
4

0 に答える 0