motor machine google engine code chrome blog c++ v8 embedded-v8

c++ - machine - ¿Qué es un recuento de campo interno y para qué se utiliza SetInternalFieldCount?



v8 engine (2)

Tengo problemas para entender qué hace realmente la función SetInternalFieldCount() . En la documentación de v8, la función se describe como configuración "el número de campos internos para los objetos generados a partir de esta plantilla". Lo cual es bastante autoexplicativo y poco iluminador.

En la guía del embebedor v8 dan este ejemplo.

point_templ->SetInternalFieldCount(1);

y diga "Aquí el recuento de campos internos se establece en 1, lo que significa que el objeto tiene un campo interno, con un índice de 0, que apunta a un objeto de C ++".

Pero, ¿qué es exactamente un campo interno y qué establece realmente este valor para el programa?


De la v8.h:

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

Si tiene una clase con 5 miembros de datos, entonces debe establecer SetInternalFieldCount en 5.

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


La función SetInternalFieldCount indica a V8 que asigne ranuras de almacenamiento interno para cada instancia creada usando la plantilla. Esto le permite almacenar cualquier tipo de información dentro de esas instancias.

Es útil, por ejemplo, almacenar la conexión entre el objeto V8 y la instancia de clase C ++.

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

o para puntero alineado:

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

Después de esto, en otra parte de un programa, puede obtener su puntero de esta manera:

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 }