diff --git a/ecmascript/js_object.cpp b/ecmascript/js_object.cpp index 0b4d939cd407fe599703afaa683d549372298c77..d5318f8703e623034724adba77df0a8c09ea6c5a 100644 --- a/ecmascript/js_object.cpp +++ b/ecmascript/js_object.cpp @@ -2485,17 +2485,26 @@ JSHandle JSObject::EnumerateObjectProperties(JSThread *thread, JSHandle JSObject::LoadEnumerateProperties(JSThread *thread, const JSHandle &object) { PropertyAccessor accessor(thread, object); - JSHandle fastKeys = accessor.GetKeysFast(); - RETURN_HANDLE_IF_ABRUPT_COMPLETION(JSForInIterator, thread); JSMutableHandle keys(thread, JSTaggedValue::Undefined()); JSMutableHandle cachedHclass(thread, JSTaggedValue::Undefined()); - if (fastKeys->IsUndefined()) { + auto *hclass = object->GetTaggedObject()->GetClass(); + auto env = thread->GetEcmaVM()->GetGlobalEnv(); + if (JSObject::Cast(hclass->GetPrototype().GetTaggedObject())->GetClass() != + env->GetObjectFunctionPrototypeClass().GetObject()) { keys.Update(accessor.GetKeysSlow()); - RETURN_HANDLE_IF_ABRUPT_COMPLETION(JSForInIterator, thread); - } else { - keys.Update(fastKeys); cachedHclass.Update(accessor.GetCachedHclass()); } + else { + JSHandle fastKeys = accessor.GetKeysFast(); + RETURN_HANDLE_IF_ABRUPT_COMPLETION(JSForInIterator, thread); + if (fastKeys->IsUndefined()) { + keys.Update(accessor.GetKeysSlow()); + RETURN_HANDLE_IF_ABRUPT_COMPLETION(JSForInIterator, thread); + } else { + keys.Update(fastKeys); + cachedHclass.Update(accessor.GetCachedHclass()); + } + } return thread->GetEcmaVM()->GetFactory()->NewJSForinIterator(object, keys, cachedHclass); }