web-dev-qa-db-ja.com

newを使用して作成できるようにV8JavascriptEngineでC ++クラスをどのように公開しますか?

公式の例 Pointクラスを公開することは、プログラム内に固定数のインスタンスがあることを前提としているようです。 Javascriptでnewが呼び出されたときに、C++コードで新しいインスタンスがどのように割り当てられるかは明確ではありません。

複数のインスタンスを持つことができるクラスをどのように公開しますか?たとえば、Imageクラス:

var img1 = new Image( 640, 480 );
var img2 = new Image( 1024, 768 );

img1.clear( "red" );
img2.clear( "black" );
30
Steve Hanov

これは最高です C++オブジェクトをV8Javascriptに公開することで見つけたブログ投稿 。それはより深い詳細に入り、コードスニペットでそれをより小さなステップに分解します。警告:コードスニペットにはほとんど矛盾がなく、理解するのに数回の読み取りが必要でした。事前に私の簡単な要約を読むことは役立つかもしれません:

  1. オブジェクトはV8テンプレートでラップする必要があります。注:GoogleのサンプルではObjectTemplatesを使用していますが、作成者はFunctionTemplatesを好む理由を説明しています。
    1. FunctionTemplateを作成します。このテンプレートのインスタンスには、C++オブジェクトのメモリアドレスを格納するための内部フィールドがあります。また、クラスのアクセサメソッドも取得します。
    2. これらのFunctionTemplatesの1つでC++オブジェクトをラップする関数wrapObject()を作成します。
  2. コンストラクターも(異なる)V8テンプレートでラップする必要があります。不要な再帰を回避するために、別のテンプレートが使用されます。 (両方のテンプレートを1つに組み合わせる方法は、ブログ投稿の最後に記載されています。)
    1. 別のFunctionTemplateを作成します。このテンプレートは、JavaScriptグローバルスコープ(newが呼び出される場所)をC++コンストラクターに接続するだけです。
    2. テンプレートが呼び出すメソッドを作成します。このメソッドは、実際にはC++ new演算子を使用し、C++クラスコンストラクターを呼び出します。次に、ステップ1.2で作成したwrapObject()メソッドを呼び出して、オブジェクトをラップします。

ここで、ステップ2.2で割り当てられたメモリは、しばらくの間deleteされる必要があります。 更新:次のブログエントリ「 永続ハンドル 」では、これについて詳しく説明しています。

これらのブログ投稿でほのめかされている実際のコード に関する私のメモ:

  • ブログのwrapPoint()メソッドは、実際には実際のコードのunwrap()メソッドに類似しています。 notwrap()
  • コード間のその他の共通点を見つけるには、次を検索します。SetInternalFieldCount(0constructorCall
  • 実際のコードは、MakeWeak()メソッドを使用して、クリーンアップを実行するコールバックメソッドを設定することにより、メモリ管理を行っているようです。
30
Leftium

これは私がしばらく前に書いたヘルパーで、v8でのコンテキストの公開と処理を非常に簡単にします。それが役に立てば幸い。

https://gamedev.stackexchange.com/questions/2796/binding-c-and-v8-javascript-from-google/2797#2797

3