Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index cfa0553b56e6faaca60f36f7a46fc6025a920843..a4f671804e0eed7dff64292f19174b9a26249adb 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -4704,7 +4704,37 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_IsPropertyEnumerable) { |
uint32_t index; |
if (key->AsArrayIndex(&index)) { |
- return isolate->heap()->ToBoolean(object->HasElement(index)); |
+ JSObject::LocalElementType type = object->HasLocalElement(index); |
+ switch (type) { |
+ case JSObject::UNDEFINED_ELEMENT: |
+ case JSObject::STRING_CHARACTER_ELEMENT: |
+ return isolate->heap()->false_value(); |
+ case JSObject::INTERCEPTED_ELEMENT: |
+ case JSObject::FAST_ELEMENT: |
+ return isolate->heap()->true_value(); |
+ case JSObject::DICTIONARY_ELEMENT: { |
+ if (object->IsJSGlobalProxy()) { |
+ Object* proto = object->GetPrototype(); |
+ if (proto->IsNull()) { |
+ return isolate->heap()->false_value(); |
+ } |
+ ASSERT(proto->IsJSGlobalObject()); |
+ object = JSObject::cast(proto); |
+ } |
+ FixedArray* elements = FixedArray::cast(object->elements()); |
+ NumberDictionary* dictionary = NULL; |
+ if (elements->map() == |
+ isolate->heap()->non_strict_arguments_elements_map()) { |
+ dictionary = NumberDictionary::cast(elements->get(1)); |
+ } else { |
+ dictionary = NumberDictionary::cast(elements); |
+ } |
+ int entry = dictionary->FindEntry(index); |
+ ASSERT(entry != NumberDictionary::kNotFound); |
+ PropertyDetails details = dictionary->DetailsAt(entry); |
+ return isolate->heap()->ToBoolean(!details.IsDontEnum()); |
+ } |
+ } |
} |
PropertyAttributes att = object->GetLocalPropertyAttribute(key); |