| 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); | 
|  |