2012-09-01 16 views
5

Estas son las funciones para crear nuevas primitivas en la API C++: V8¿Por qué Boolean :: New() devuelve un Handle <> mientras que otras primitivas devuelven Local <>?

Handle<Boolean> v8::Boolean::New(bool value) 
Local<Number> v8::Number::New(double value) 
Local<String> v8::String::New(const char *data, int length=-1) 

Me pregunto por qué Boolean devuelve un Handle mientras que los otros devuelven un Local.

Mi suposición es que está relacionado con los booleanos que tienen solo dos valores posibles, pero desafortunadamente los documentos son realmente pobres y no mencionan cosas como esa.

Respuesta

5

Esta es la implementación de Boole :: Nueva: (v8.h)

Handle<Boolean> Boolean::New(bool value) { 
    return value ? True() : False(); 
} 

Y esto es lo que podemos obtener de api.cc:

v8::Handle<Boolean> True() { 
    i::Isolate* isolate = i::Isolate::Current(); 
    if (!EnsureInitializedForIsolate(isolate, "v8::True()")) { 
    return v8::Handle<Boolean>(); 
    } 
    return v8::Handle<Boolean>(
     ToApi<Boolean>(isolate->factory()->true_value())); 
} 

que se parece a la que están internando valores verdaderos y falsos para cada aislamiento. AFAIK esta es una técnica de uso frecuente en máquinas virtuales para disminuir el número de objetos creados; por ejemplo, Java internan todos los literales de cadena, así como objetos booleanos y de bytes (aunque el interning solo se menciona para cadena en la especificación de JVM, I ' también lo he visto suceder para enteros pequeños, etc.).

Cuestiones relacionadas