Подтвердить что ты не робот

Что такое внутренний подсчет полей и для чего используется SetInternalFieldCount?

Мне сложно понять, что на самом деле делает функция SetInternalFieldCount(). В документации v8) функция описывается как параметр "количество внутренних полей для объектов, генерируемых из этого шаблона". Который довольно объяснительный и неповторимый.

В руководстве по внедрению v8 они приводят этот пример

point_templ->SetInternalFieldCount(1); 

и скажите: "Здесь внутренний счетчик полей установлен в 1, что означает, что объект имеет одно внутреннее поле с индексом 0, которое указывает на объект С++".

Но что такое внутреннее поле и что устанавливает значение этого значения на самом деле в программе?

4b9b3361

Ответ 1

Функция SetInternalFieldCount указывает V8 выделять внутренние слоты для хранения для каждого экземпляра, созданного с использованием шаблона. Это позволяет вам хранить любую информацию внутри этих экземпляров.

Полезно, например, сохранять соединение между объектом V8 и экземпляром класса С++.

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

или для выровненного указателя:

obj->SetAlignedPointerInInternalField(0, 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
}

Ответ 2

Из v8.h:

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

Если у вас есть класс с 5 членами данных, вы должны установить SetInternalFieldCount равным 5.

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