問題タブ [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.
node.js - 削除されたC++オブジェクトを指すハンドルを無効にする
v8に公開されているC++オブジェクトが削除された場合、このオブジェクトを指している可能性のあるハンドルを無効にするにはどうすればよいですか。
大規模なアプリケーションへのスクリプトインターフェイスとしてv8を使用しています。より大きなアプリケーションのオブジェクトは、ノードのObjectWrapクラスを使用してv8でラップおよびアクセスされます。
問題は、ラップされたオブジェクトの有効期間が制限されていることです。javascriptで、次のようなものを実行した場合:
コメントのように振る舞ってほしい。win.close()(またはJSの制御外の可能性がある他のイベント)の後、winまたは複製されたハンドルへのアクセスは失敗する必要があります。
現在、ラップされたC ++オブジェクトを無効としてマークし、すべてのメソッド呼び出しで有効性を確認する必要があります。これを行う唯一の方法ですか、それともハンドルを無効としてマークする方法はありますか?
javascript - Rubyracer (Ruby の V8 バインディング) のパフォーマンスが非常に遅い
そのため、 eventmachineに TCP サーバーがあり、サーバーへの操作 (フィルターや拡張機能など) を事前に保留する方法として、rubyracer が使用されています。サーバーが大量のデータを受信していないときはすべて魅力的に機能しますが、フラッディングされているとき (必要な場合もあります) は非常に遅くなります。
そこで、Rubyracer が Ruby と比べてどれほど遅いかを確認するために小さなベンチマークを実行しました。結果を見てショックを受けました。
正直なところ、遅いかどうかは気にしませんが、データの処理が完了するまでサーバー全体をロックしたくありません。を使用するEM::defer
ことは実際にはオプションではありません (試してみましたが、フラッディングの程度によっては、膨大な数のスレッドが生成される場合があります)。私はプロトコルを設計していないので、フラッディングを回避することはできず、クライアントはプロトコルをそのようにする必要があります (恐ろしいほど)。
ベンチマーク コード:
編集
質問: therubyracer によるボトルネックを解消する方法はありますか? 他の方法で JavaScript を Ruby に実装することは許容されます。
2012年03月07日更新
[native code]
それで、コードを最適化することができました。なぜなら、ボトルネックの原因はRuby <-> JS通信であると考えたからです.Rubyはクラスのgetterメソッドとsetterメソッドを使用しているため、実行されるたびに発生しました.オブジェクトが言語間で直接渡されたとき。
そのため、JS 側でキャッシングすることにより、Ruby と JS 間の呼び出しの数を減らしましたが、少なくとも 1 つのオブジェクトを関数に渡す必要があるため、期待したほどには最適化されませんでした: aHash
または少なくともJSONの代わりString
に a を渡すことさえしましたが、Fixnum
これは FML だと叫びましたが、これは文字列を渡すよりも大きな改善ではありませんでした (仮にあったとしても)。
私はまだ私よりも優れた迅速な解決策を望んでいます。
python - 無効な xpath を使用して PyV8 コンテキスト内から lxml の .xpath() を呼び出すと、Python がクラッシュします。なんで?
無効な xpath を使用して PyV8 コンテキスト内から lxml の .xpath() を呼び出すと、Python がクラッシュします。なんで?
.xpath の呼び出しで使用する前に、lxml を使用して s が有効な xpath 式であるかどうかを確認する方法はありますか?
PS: 関連する場合の追加情報: 私は Macbook (Intel の Core2 Duo P7450 CPU) で実行されている Python 2.6、Win 7 32 ビットを使用しています。
エラーを再現するスクリプト:
編集:タイトルを変更し、スクリプトを追加してエラーを再現しました。当初の質問は、xpath 式の先頭の ':' 文字がエラーを引き起こした理由に関するものでしたが、xpath が PyV8 コンテキスト内から呼び出されたときに無効な xpath 式が原因で問題が発生する可能性があります。
javascript - V8を「ロックダウン」する方法は?
私はV8を初めて使用し、PythonWebアプリケーションで使用する予定です。目的は、ユーザーが特定のJSスクリプトを送信して実行できるようにすることです。明らかにこれはセキュリティ上の脅威であるため、v8を「ロックダウン」する方法を文書化したリソースを探しています。たとえば、呼び出すことができる関数のホワイトリストを作成できますか?または、参照を許可されていないライブラリのブラックリスト?
c++ - スコープとスレッド ローカルは (V8 の) C++ でどのように機能しますか?
V8 のスコープの仕組みに興味があります。
スタック上のスコープ オブジェクトは、他のスコープ オブジェクトとコンテキストをスタックのさらに上にどのように見つけることができますか?
HandleScopes がどのように機能するかを調べたところ、それらはスレッド ローカルに依存していることがわかりました。これにより、これらが C++ でどのように機能するのか疑問に思いました。実装を見つけましたが、何が起こっているのかまだ理解していません。
api.cc -- HandleScope は現在の Isolate を探します
isolate.cc -- 静的メソッドは現在の isolate をスレッド ローカルとして検索します
platform.h -- 低レベルのメソッドを呼び出して、スレッド ローカルを取得します。
platform-tls-win32.h -- 魔法が起こる
- この最後の方法はどのくらい正確に機能していますか?
- どこを見るべきかをどのように知っていますか?
- スタックの構造は何ですか?
c99 - Google V8 を ANSI C アプリケーションに埋め込む - どこから始めればよいでしょうか?
ANSI C アプリケーションに JavaScript エンジンを組み込みたいと考えています。
実際、いくつかの C 変数や関数と対話しながら、実行時に入力されたコードを実行できるようにしたいと考えています。
では、V8 が唯一の選択肢でしょうか。どこから始めればよいですか?
c++ - 引数を指定して c++ から v8 JavaScript 関数を呼び出す
私は c++ と v8 を使用していますが、次の課題に直面しました: v8 を使用して JavaScript で関数を定義し、後で c++ を介してその関数を呼び出したいと考えています。さらに、c++ から javascript 関数に引数を渡せるようにしたいと考えています。次のサンプル ソース コードが最もよく説明されていると思います。サンプル コードの最後をチェックして、何を達成しようとしているのかを確認してください。
任意のヒント?
アップデート:
与えられたアドバイスに基づいて、次のコードをまとめることができました。テスト済みで動作します:
javascript - glBindTexture()にはGLuintポインターが必要ですか?
OpenGL / V8/JavaScriptでテクスチャを使用するためのOpenGLバインディングを実装しようとしています。
私の質問はとても簡単です:
OpenGLのglBindTexture()メソッドはGLuintへのポインターを必要としますか、それとも有効なGLuintのみを必要としますか?
ここにあるkhronosのドキュメントには、GLuintのみが必要であると記載されています。
http://www.khronos.org/opengles/documentation/opengles1_0/html/glBindTexture.html
問題は次のとおりです。
テクスチャの初期化とロードに使用されるv8JavaScriptコンテキストにカスタムデータ型があります。ロード後、テクスチャは次の方法で生成されました。
したがって、このメソッドはc ++側からGLuintを返し、キャストされた整数値をプロパティ「id」としてJavaScriptコンテキストのオブジェクトにアタッチします。
v8のグローバルgl(名前空間)オブジェクトでbindTextureメソッドを使用すると、ネイティブ側で次のようになります。
c++ - カスタム変更された v8::Arguments を使用して v8::Function を呼び出す方法は?
変更された引数を使用して C++ 側から JSON.stringify メソッドを呼び出したいのですが、頭に浮かんだ解決策は、すべてのフレームが "??" である奇妙なセグメンテーション違反になります。
私は次のことをしたいと考えています: api::Console はデバッグ目的のカスタム コンソール実装であり、したがって api::Console::handleLog や api::Console::handleDebug のような静的メソッドがあります。
コンソールの ObjectTemplate に正しく渡される handleDebug の場合、次は機能しません。v8gl::context は現在の実行コンテキストであり、他の API 実装で正しく使用できます。
gdb のバックトレースはどういうわけか奇妙で、その理由がわかりません:
だから私の質問は次のとおりです。
v8::Function の Call() メソッドで使用するために、ローカル値 "v8::Arguments& args" から "v8::Handle<v8::Value>*" に正しくキャストするにはどうすればよいですか?
args[a] をループで直接使用したい場合、v8::Function::Call の異なるシグネチャに対してコンパイラ エラーがスローされますが、これは args がローカル値であるため正しいものです。v8::Function::Call の署名は次のとおりです。
v8::Local<v8::Value> v8::Function::Call(v8::Handle<v8::Object>, int, v8::Handle <v8::Value>*)
// 編集: passargs[false index] を更新
c++ - 複数の v8::Context で global_object を正しく再利用するには?
V8 を OpenGL 実装でリファクタリングしていますが、実行コンテキストの問題で行き詰まりました。
コンセプトは次のとおりです。
V8GL::initialize()
このメソッドは、コンテキストとグローバル テンプレートを初期化します。また、JS コンテキストにも公開されているいくつかのループが実行されているため、glut のコンテキストも使用します。(例glut.mainLoop()
)V8GL::execute(context, source, url)
このメソッドは、ほとんどの場合、特定のコンテキスト内で文字列を実行します。後で間隔/タイムアウトを使用して分離するためには、このようにする必要があると思います。
機能しないもの:
V8GL::initialize()
また、組み込みの JavaScript ファイルを添付して実行します。それは完全にうまくいきます。
簡略化されたコード:
問題:
それが初期化でした。これで問題なく動作するので、JavaScript の実行で自分のライブラリの内容を利用できます。しかし、引数を介して渡される別のファイルを実行したかったのです。したがって、main.cpp は次のmain()
ようになります。
質問:
- で使用するために global の objectTemplate をキャッシュする必要があり
v8::Context::New()
ますか? - global_object は永続的またはローカルである必要がありますか?
- どうすれば再利用できますか?およびは
DetachGlobal()
、ReattachGlobal()
複数のコンテキストではなく、単一のコンテキストでのみ機能しました。私の場合、複数のコンテキストが必要です。