¿Qué es un recuento de campos interno y para qué se utiliza SetInternalFieldCount?


Estoy teniendo problemas para entender lo que la función SetInternalFieldCount() realmente hace. En la documentación v8 la función se describe como establecer "el número de campos internos para los objetos generados a partir de esta plantilla."Lo cual es bastante autoexplicativo y poco luminoso.

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

point_templ->SetInternalFieldCount(1); 

Y decir " 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 C++."

Pero, ¿qué es exactamente un campo interno y qué indica realmente al programa establecer este valor?

Author: Loourr, 2013-05-17

2 answers

Function SetInternalFieldCount le 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
}
 23
Author: iefserge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-02 12:45:53

Del 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;
}
 -5
Author: luistm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-26 13:57:24