2013-05-17 5 views
26

Mam problem ze zrozumieniem, co właściwie robi funkcja SetInternalFieldCount(). W v8 documentation funkcja jest opisana jako ustawienie "liczba wewnętrznych pól dla obiektów wygenerowanych z tego szablonu". Co jest dość intuicyjne i niezastąpione.Co to jest wewnętrzna liczba pól i do czego służy SetInternalFieldCount?

W v8 embedder's guide dają ten przykład

point_templ->SetInternalFieldCount(1); 

mówiąc „tu wewnętrzny licznik obszaru jest równy 1, co oznacza, że ​​przedmiot posiada jedno wewnętrzne pola, indeksie 0, to wskazuje na C++ obiekt."

Ale czym dokładnie jest pole wewnętrzne i co ustawienie tej wartości rzeczywiście informuje program?

Odpowiedz

23

Funkcja SetInternalFieldCount instruuje V8 przydzielić pamięci wewnętrznej gniazda dla każdej instancji utworzonej przy użyciu szablonu. To pozwala przechowywać wszelkie informacje wewnątrz tych instancji.

Przydaje się na przykład do przechowywania połączenia pomiędzy obiektem V8 a instancją klasy C++.

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

lub wyrównany do palików:

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

po tym w innej części programu można uzyskać wskaźnik tak:

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

Dokładnie. Dzięki temu niektóre dane w C++ mogą być oznaczane razem z obiektem, dzięki czemu są dostępne dla szablonu obiektu, gdy trzeba wykonać takie czynności, jak wyszukiwanie lub ustawianie wartości. – xaxxon

+0

W takim przypadku, gdy "obj" jest GCed w JavaScript, czy obiekt wskazywany przez "p" również zostanie usunięty? (Powinienem najpierw sprawdzić kod źródłowy V8.) –

-5

Z v8.h:

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

Jeśli masz klasę z 5 członków danych, wówczas należy ustawić SetInternalFieldCount do 5.

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

ten został przegłosowany, bo w tej sytuacji, ustawiasz wewnętrzną liczbę pól na 1 i dodajesz obiekt, który zawiera wszystkie 5 z tych wartości. – xaxxon