問題タブ [embedded-v8]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - V8スタティックライブラリをリンクするAndroid NDK:シンボルが見つかりませんが、そこにあります
私はこれで髪を伸ばしてきました。Ubuntu 12.04 64 ビットで開発しています。V8 が組み込まれたネイティブ Android アプリを作成しましたが、コンピューターを再起動した後、V8 とリンクしなくなりました。ndk を再インストールして V8 を再コンパイルしようとしましたが、役に立ちませんでした。リンカーには静的ライブラリが含まれているようですが、それらのシンボルが見つかりません。nmで確認したところ、シンボルがそこにあるようです。
ndk_build を実行すると、次の出力が得られます。
特に、次の行は *.a ファイルが含まれていることを示しています。
私の Android.mk は次のようになります。
LOCAL_STATIC_LIBRARIES の順序は経験的に決定されました。私はそれをもう少しいじりましたが、役に立ちませんでした。LOCAL_WHOLE_STATIC_LIBRARIES も試しました。nmでシンボルの存在を確認しました:
私は名前変更の専門家ではありませんが、彼らはそこにいるようです。値はすべてゼロですが、これは正常だと思います。
だから私は、リンカが静的ライブラリを理解していない可能性があり、黙って失敗したと考えました。
しかし、リンカーがシンボルの取得に失敗した理由を確認するにはどうすればよいでしょうか?
v8 - v8 で同じコードを 2 回実行する正しい方法 (配列の範囲外は 2 回目の実行で失敗する - デオプティマイザ)
次のプログラムは、v8入門ページの例に基づいています。発生している問題を示すために、次の 3 つの変更を加えました。
- 空の配列を作成し、それをグローバル コンテキストに配置します。
- 実行中のスクリプトは配列内の 0 番目の要素を参照しており、未定義を返す必要があります。
- コンパイルしたスクリプトを 2 回実行します。
最初の実行は正常に機能します。2 番目の失敗: v8 は Deoptimizer::DoComputeCompiledStubFrame() で V8_Fatal() を呼び出します。記述子->register_param_count_ == -1 であるためです。
ここで何か間違ったことをしていますか?どうすれば修正できますか?
ノート:
- これは main() の本体全体です。
- JavaScript コードの他のフラグメントは、問題なく 2 回実行されます。どういうわけか、これは範囲外の配列参照に関連しており、おそらく最適化解除をトリガーしています。
- 通常、これらのスクリプトを何千回、場合によっては何百万回も実行しているため、毎回スクリプトを最初から再コンパイルする必要はありません。
- スクリプトを UnboundScript としてコンパイルし、実行ごとにバインドしようとしましたが、結果は同じです。
- これをv8の問題として報告しましたが、誰も応答していないので、StackOverflow コミュニティが助けてくれることを願っています。
- これは VS2012 Update 4 でも見られますが、VS2008、x64 と x86 の両方、デバッグ ビルドとリリース ビルドの両方でも見られます。
javascript - Google V8 エンジンは、異なるスレッドの異なるコンテキストで異なる Javascript を同時に実行できますか?
マルチスレッド プロセスである C++ アプリケーションに Google V8 を埋め込む予定です。複数の Javascript を同時に実行する必要があります。複数の V8 コンテキストを作成し、異なる Javascript を異なるスレッドの異なるコンテキストで同時に実行することはできますか? 各コンテキストは、他のコンテキストと通信する必要はありません。ロックしたくない、またはスクリプトの同時実行を待つだけです。ありがとう!
v8 - v8::Persistent に入る方法マルチスレッド環境で?
複数の v8::Isolate オブジェクトを常に入力/終了して、JavaScript コードをコンパイルおよび実行するマルチスレッド環境をセットアップしようとしています。特定の Isolate/Context でいくつかの JavaScript コードをコンパイルして実行するメソッドがあります。
ただし、コード内のコメントでわかるように、機能しません。Persistent と一緒に特定の Isolate を入力したいだけです。それ、どうやったら出来るの?
前もって感謝します!
c++ - node::objectWrap とクラス ラッパーの継承
C++ クラスがあるとします。
このクラスを Node にバインドするには、次の 2 つの方法があります。
方法 I - node::objectWrap を直接継承する
このようにして、クラス構造を直接編集しています。しかし、より簡単な方法があり、それは次のとおりです。
方法 II - 元のクラスへの参照を内部的に保持する
メソッド II の注意事項 にはcClassWrapper
内部フィールドが 1 つしかなく、それはinternal_
です。単にcClassWrapper
のユーザーでcClass
あり、 の内部cClass
は変更されていません。
明らかに、方法 II のクラス構造は変更されていないため、実装が簡単cClass
ですが、その欠点は何か (もしあれば?) を知りたいと思っています。v8 のガベージ コレクターはinternal_
、私が歩き回っているときに削除し続けcClassWrapper
ますか?
2 つの実装の違いが何であるかはわかりません。
c++ - 別のクローンである異なる v8 コンテキストの作成
Google の v8 c++ ライブラリを使用して、いくつかのテンプレート、変数、およびグローバルを定義し、コード内のいくつかの場所で使用する準備ができているコンテキストを作成したいと考えています。これらのスレッドは、それぞれが独自の分離を持ち、異なるスレッドで実行される可能性があります。それぞれがコンテキストの独自のローカル コピーを持っているため、1 つのスレッドでグローバル変数を変更しても、他のスレッドには影響しません。
新しいコンテキストが必要になるたびに、すべてのテンプレート、変数、およびグローバルを明示的に設定することでこれを行うことができますが、より効率的な方法があるかどうか疑問に思っています。マスター状態を表すグローバルな v8::Isolate ポインターと v8::Persistent が既にあるとします。独自のスレッドで真新しい分離を作成し、本質的にマスターのクローンである新しいコンテキストを作成したい場合、次に何をする必要がありますか? 必要に応じて、マスターへのアクセスをミューテックスでラップして、異なるスレッドが同時にマスターにアクセスしないようにすることができます。ある分離株で作成された情報を、内容全体を最初から再作成せずに別の分離株に効率的にコピーする方法がわかりません。
c++ - v8 での無限再帰の検出
私はGoogleのv8 JavaScriptエンジンを使用して、ユーザー提供のコードを実行できる必要があるプロジェクトにjsインタープリターを埋め込んでいますが、ユーザーコードを呼び出す前に何かを設定できるかどうか疑問に思っています。コードが無期限に再帰しようとすると (または実行時間が長すぎる場合でも)、何らかの方法で中止し、キャッチされていない例外をスローし、問題を呼び出し元に報告することができます。
これまでの回答に感謝します...はい、これを投稿して間もなく、私は基本的に停止の問題に対する何らかの解決策を求めていたことに気付きました。必要。
私が必要としているのは、v8 環境で実行されている何かが十分に迅速に戻ってきたことを検出するためのメカニズム、または単に再帰が発生しているかどうかを検出するためのメカニズムです...私のユースケースは、エンドユーザーがすべきではないものですとにかく再帰を利用していて、それを検出できれば、やみくもに実行するのではなく、その時点で拒否できます。ただし、異なるスレッドでは、異なるアイソレートで同じ関数を同時に呼び出すことが許可されるため、静的ローカル変数を使用して同じ関数への別の呼び出しをロックアウトすることはできません。