@@ -904,39 +904,46 @@ namespace Js
904904 JsUtil::BaseDictionary<const char16*, Var, Recycler> dict (scriptContext->GetRecycler ());
905905 JavascriptArray* arrResult = scriptContext->GetLibrary ()->CreateArray ();
906906
907- // 13.7.5.15EnumerateObjectProperties (O)#
908- // for (let key of Reflect.ownKeys(obj)) {
907+ // 13.7.5.15 EnumerateObjectProperties (O) (https://tc39.github.io/ecma262/#sec-enumerate-object-properties)
908+ // for (let key of Reflect.ownKeys(obj)) {
909909 Var trapResult = JavascriptOperators::GetOwnPropertyNames (this , scriptContext);
910- Assert (JavascriptArray::Is (trapResult));
911- ((JavascriptArray*)trapResult)->GetEnumerator (false , &enmeratorObj, scriptContext);
912- JavascriptEnumerator* pEnumerator = JavascriptEnumerator::FromVar (enmeratorObj);
913- while ((propertyName = pEnumerator->GetCurrentAndMoveNext (propertyId)) != NULL )
914- {
915- PropertyId propId = JavascriptOperators::GetPropertyId (propertyName, scriptContext);
916- Var prop = JavascriptOperators::GetProperty (RecyclableObject::FromVar (trapResult), propId, scriptContext);
917- // if (typeof key === "string") {
918- if (JavascriptString::Is (prop))
910+ if (JavascriptArray::Is (trapResult))
911+ {
912+ ((JavascriptArray*)trapResult)->GetEnumerator (false , &enmeratorObj, scriptContext);
913+ JavascriptEnumerator* pEnumerator = JavascriptEnumerator::FromVar (enmeratorObj);
914+ while ((propertyName = pEnumerator->GetCurrentAndMoveNext (propertyId)) != NULL )
919915 {
920- Js::PropertyDescriptor desc;
921- JavascriptString* str = JavascriptString::FromVar (prop);
922- // let desc = Reflect.getOwnPropertyDescriptor(obj, key);
923- BOOL ret = JavascriptOperators::GetOwnPropertyDescriptor (this , str, scriptContext, &desc);
924- // if (desc && !visited.has(key)) {
925- if (ret && !dict.ContainsKey (str->GetSz ()))
916+ PropertyId propId = JavascriptOperators::GetPropertyId (propertyName, scriptContext);
917+ Var prop = JavascriptOperators::GetProperty (RecyclableObject::FromVar (trapResult), propId, scriptContext);
918+ // if (typeof key === "string") {
919+ if (JavascriptString::Is (prop))
926920 {
927- dict.Add (str->GetSz (), prop);
928- // if (desc.enumerable) yield key;
929- if (desc.IsEnumerable ())
921+ Js::PropertyDescriptor desc;
922+ JavascriptString* str = JavascriptString::FromVar (prop);
923+ // let desc = Reflect.getOwnPropertyDescriptor(obj, key);
924+ BOOL ret = JavascriptOperators::GetOwnPropertyDescriptor (this , str, scriptContext, &desc);
925+ // if (desc && !visited.has(key)) {
926+ if (ret && !dict.ContainsKey (str->GetSz ()))
930927 {
931- ret = arrResult->SetItem (index++, prop, PropertyOperation_None);
932- Assert (ret);
928+ dict.Add (str->GetSz (), prop);
929+ // if (desc.enumerable) yield key;
930+ if (desc.IsEnumerable ())
931+ {
932+ ret = arrResult->SetItem (index++, prop, PropertyOperation_None);
933+ Assert (ret);
934+ }
933935 }
934936 }
935- }
937+ }
938+ }
939+ else
940+ {
941+ AssertMsg (false , " Expect GetOwnPropertyNames result to be array" );
936942 }
937943
938- *enumerator = IteratorObjectEnumerator::Create (scriptContext,
944+ *enumerator = IteratorObjectEnumerator::Create (scriptContext,
939945 JavascriptOperators::GetIterator (RecyclableObject::FromVar (arrResult), scriptContext));
946+
940947 return TRUE ;
941948 }
942949
0 commit comments