2013-05-17 9 views
26

実際にSetInternalFieldCount()の機能を理解するのに問題があります。 v8 documentationでは、この関数は「このテンプレートから生成されたオブジェクトの内部フィールドの数」を設定するものとして記述されています。それはかなり自明であり、明るくない。彼らはCを指し、この例に内部フィールドのカウントとは何ですか?SetInternalFieldCountは何のために使用されますか?

point_templ->SetInternalFieldCount(1); 

を与え、ここで、内部フィールドカウントが0のインデックスと、オブジェクトが1つの内部フィールドを有することを意味する1に設定されている」と言う、そのv8 embedder's guide

++オブジェクト。

しかし、内部フィールドは正確に何であり、この値を設定すると実際にプログラムに通知されますか? v8.hから

答えて

23

にSetInternalFieldCountを設定しなければならない機能SetInternalFieldCountは内部ストレージを割り当てるためにV8を指示テンプレートを使用して作成されたすべてのインスタンスのスロット。これにより、これらのインスタンス内にあらゆる種類の情報を格納できます。

たとえば、V8オブジェクトとC++クラスインスタンスの間の接続を保存すると便利です。あなたはこのようなあなたのポインタを取得することができ、プログラムの別の部分で、この後

obj->SetAlignedPointerInInternalField(0, p);  // 0 means 1-st internal field 

void* p; // any pointer 
Local<Object> obj = point_templ->NewInstance(); 
obj->SetInternalField(0, External::New(p));  // 0 means 1-st internal field 

または整列ポインタのため

これが原因でこのような状況で否決しまっ

v8::Handle<v8::Object> handle; // some object handle 
if (handle->InternalFieldCount() > 0) 
{ 
    void* p = handle->GetAlignedPointerFromInternalField(0); // from 1-st field 
    // ... do something with p, e.g. cast it to wrapped C++ class instance 
} 
+0

正確に。これにより、いくつかのC++データがオブジェクトとともにタグ付けされるので、オブジェクトを検索したり値を設定したりする必要があるときにオブジェクトテンプレートで使用できるようになります。 – xaxxon

+0

この場合、JavaScriptで "obj"をGCした場合、 "p"が指すオブジェクトも削除されますか? (まず、V8のソースコードをチェックしておいたはずです)。 –

-5

/** 
* Sets the number of internal fields for objects generated from 
* this template. 
*/ 
void SetInternalFieldCount(int value); 

あなたは5つのデータメンバを持つクラスを持っている場合は、あなたが5

class MyObject: public node::ObjectWrap { 
public: 
    int i; 
    int j; 
    int n; 
    int z; 
    int w; 
} 
+1

、内部フィールド数を1に設定し、それらの値の5つをすべて含むオブジェクトを追加します。 – xaxxon

関連する問題