Index: src/handles.cc |
=================================================================== |
--- src/handles.cc (revision 8625) |
+++ src/handles.cc (working copy) |
@@ -427,14 +427,38 @@ |
Object* holder = obj->BypassGlobalProxy(); |
if (holder->IsUndefined()) return isolate->factory()->undefined_value(); |
obj = Handle<JSObject>(JSObject::cast(holder), isolate); |
- CALL_HEAP_FUNCTION(isolate, |
- obj->GetHiddenProperties(create_if_needed), |
- Object); |
-} |
+ if (obj->HasFastProperties()) { |
+ // If the object has fast properties, check whether the first slot |
+ // in the descriptor array matches the hidden symbol. Since the |
+ // hidden symbols hash code is zero (and no other string has hash |
+ // code zero) it will always occupy the first entry if present. |
+ DescriptorArray* descriptors = obj->map()->instance_descriptors(); |
+ if ((descriptors->number_of_descriptors() > 0) && |
+ (descriptors->GetKey(0) == isolate->heap()->hidden_symbol()) && |
+ descriptors->IsProperty(0)) { |
+ ASSERT(descriptors->GetType(0) == FIELD); |
+ return Handle<Object>(obj->FastPropertyAt(descriptors->GetFieldIndex(0)), |
+ isolate); |
+ } |
+ } |
-Handle<Smi> GetIdentityHash(Handle<JSObject> obj) { |
- CALL_HEAP_FUNCTION(obj->GetIsolate(), obj->GetIdentityHash(), Smi); |
+ // Only attempt to find the hidden properties in the local object and not |
+ // in the prototype chain. Note that HasLocalProperty() can cause a GC in |
+ // the general case in the presence of interceptors. |
+ if (!obj->HasHiddenPropertiesObject()) { |
+ // Hidden properties object not found. Allocate a new hidden properties |
+ // object if requested. Otherwise return the undefined value. |
+ if (create_if_needed) { |
+ Handle<Object> hidden_obj = |
+ isolate->factory()->NewJSObject(isolate->object_function()); |
+ CALL_HEAP_FUNCTION(isolate, |
+ obj->SetHiddenPropertiesObject(*hidden_obj), Object); |
+ } else { |
+ return isolate->factory()->undefined_value(); |
+ } |
+ } |
+ return Handle<Object>(obj->GetHiddenPropertiesObject(), isolate); |
} |