2012-09-01 18 views
5

Są to funkcje do tworzenia nowych prymitywów w V8 C++ API:Dlaczego Boolean :: New() zwraca uchwyt <>, podczas gdy inne prymitywy zwracają 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) 

Zastanawiam się dlaczego Boolean zwraca Handle podczas gdy inni zwracają Local.

Moje założenie jest takie, że jest związane z boolami mającymi tylko dwie możliwe wartości, ale niestety doktorzy są naprawdę biedni i nie wspominają o takich rzeczach.

Odpowiedz

5

Jest to realizacja Boolean :: nowy: (v8.h)

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

A oto, co możemy dostać od 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())); 
} 

który wygląda jak są one interning wartości true i false dla każdego Isolate. AFAIK jest to często używana technika w maszynach wirtualnych w celu zmniejszenia liczby tworzonych obiektów - na przykład Java internuje wszystkie ciągi liter, a także obiekty boolowskie i bajtowe (mimo że interning jest wymieniony tylko dla ciągu w specyfikacji JVM, I ' Widziałem też, jak to się dzieje w przypadku małych liczb całkowitych itp.).