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