Index: src/handles.cc |
=================================================================== |
--- src/handles.cc (revision 3292) |
+++ src/handles.cc (working copy) |
@@ -301,7 +301,9 @@ |
Handle<Object> GetHiddenProperties(Handle<JSObject> obj, |
bool create_if_needed) { |
- Handle<String> key = Factory::hidden_symbol(); |
+ Object* holder = obj->BypassGlobalProxy(); |
+ if (holder->IsUndefined()) return Factory::undefined_value(); |
+ obj = Handle<JSObject>(JSObject::cast(holder)); |
if (obj->HasFastProperties()) { |
// If the object has fast properties, check whether the first slot |
@@ -310,7 +312,7 @@ |
// 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) == *key) && |
+ (descriptors->GetKey(0) == Heap::hidden_symbol()) && |
descriptors->IsProperty(0)) { |
ASSERT(descriptors->GetType(0) == FIELD); |
return Handle<Object>(obj->FastPropertyAt(descriptors->GetFieldIndex(0))); |
@@ -320,17 +322,17 @@ |
// 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->HasLocalProperty(*key)) { |
+ 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 = Factory::NewJSObject(Top::object_function()); |
- return SetProperty(obj, key, hidden_obj, DONT_ENUM); |
+ return Handle<Object>(obj->SetHiddenPropertiesObject(*hidden_obj)); |
} else { |
return Factory::undefined_value(); |
} |
} |
- return GetProperty(obj, key); |
+ return Handle<Object>(obj->GetHiddenPropertiesObject()); |
} |