2

プロジェクトで Google の Javascript Engine V8を使用したいと考えており、エンジンのラッパー クラスを作成しようとしました。コードの一部は、V8 ディストリビューションの samples/shell.cc からコピーされています。

ただし、セグメンテーション違反で中止されるだけで、理由がわかりませんが、問題は発生していますがv8::internal::Top::global_context()( null のように見える invalid が原因contextです)。コード自体は私には問題ないように見えますが、おそらく私は信じられないほど愚かなことをしました:-)。

私のコードのセグメンテーション違反は で発生しv8::Script::Compileます。

問題のコード (更新): https://gist.github.com/4c28227185a14bb6288c

Luis G. Costantini R. の Answer のおかげで、問題はなくなりましたSet(もう中止されません)。ただし、公開された名前はまだ利用できず、ReferenceError が発生します...

4

5 に答える 5

1

(Context::Scope 経由で) コンテキストに入る前に JavaScript 関数 (FunctionTemplate::GetFunction()) または JavaScript オブジェクト (ObjectTemplate::NewInstance()) のインスタンスを作成しようとすると、セグメンテーション違反が発生します。理由: 利用可能な JavaScript コンテキストがなく、Function と Object の両方が常に JavaScript 実行コンテキストにのみ存在します。V8 ドキュメントによると:

Function : JavaScript 関数オブジェクト (ECMA-262、15.3)。

Object : JavaScript オブジェクト (ECMA-262、4.3.3)。

于 2011-07-15T23:40:36.610 に答える
1

v8::Context::Scope context_scope(context); を変更してください。コンストラクター (134 行目) から internal_executeString (script = v8::Script::Compile(source, name); の前) まで。これは、クラス v8::Context::Scope のデストラクタがコンテキストから終了するためです。

メソッドaddFunctionを変更しました:

void addFunction(const std::string& fname, v8::InvocationCallback func)
{
    v8::HandleScope handle_scope;
    std::cout << "before ::Set()" << std::endl;
    v8::Context::Scope context_scope(context);
    context->Global()->Set(v8::String::New(fname.c_str()),
                           v8::FunctionTemplate::New(func)->GetFunction());
    std::cout << "after ::Set()" << std::endl;
}

関数は、スクリプトの実行に使用されるコンテキストのグローバル オブジェクトに追加する必要があります。V8 の優れたチュートリアル (2 部構成) があります: http://www.homepluspower.info/2010/06/v8-javascript-engine-tutorial-part-1.html および http://www.homepluspower.info /2010/06/v8-javascript-engine-tutorial-part-2.html

于 2010-11-26T22:34:22.510 に答える
0

すべてのソースをダウンロードして自分でビルドしようとしない限り、スタック バックトレースはほとんど役に立たないので... :)

に変更js.executeString("1+1", true, false);js.executeString("1+1", true, true);て、例外ハンドラが何を伝えているかを確認しますか?

于 2010-11-23T07:10:49.593 に答える
0

同様のセグメンテーション違反があり、問題は次のようになりました。新しいスレッドを作成し、そのスレッドでオブジェクト テンプレートとオブジェクトを作成しようとしました。残念ながら、スレッドを作成する場合、そのようなことを行うには v8::Context を再度入力する必要があるようです。

ハンドルを v8::Context::Calling に新しく作成されたスレッドに渡すことで機能し、スコープを使用して新しいスレッドに入力しました。

これは、セグメンテーション違反をグーグルで検索したときに出てくる唯一の有用なものであるため、ここに書きました。

于 2011-04-27T15:30:04.117 に答える
0

このバグに刺されたようです。つまり、まだ注意していない場合です。参照したレポートが古いように見えるので、別のレポートを提出してください。おそらく、もう少し深く掘り下げて、セグメンテーション違反が受信されるまで、すべての関数呼び出しでスタック フレームを調査してください。回避策またはこのバグの修正を見つけることができます :)

于 2010-11-24T00:48:01.107 に答える