Что такое внутренний подсчет полей и для чего используется SetInternalFieldCount?
Мне сложно понять, что на самом деле делает функция SetInternalFieldCount()
. В документации v8) функция описывается как параметр "количество внутренних полей для объектов, генерируемых из этого шаблона". Который довольно объяснительный и неповторимый.
В руководстве по внедрению v8 они приводят этот пример
point_templ->SetInternalFieldCount(1);
и скажите: "Здесь внутренний счетчик полей установлен в 1, что означает, что объект имеет одно внутреннее поле с индексом 0, которое указывает на объект С++".
Но что такое внутреннее поле и что устанавливает значение этого значения на самом деле в программе?
Ответы
Ответ 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;
}