@@ -1096,6 +1096,92 @@ namespace Js
1096
1096
return JavascriptOperators::GetOwnEnumerablePropertyNames (object, scriptContext);
1097
1097
}
1098
1098
1099
+ Var JavascriptObject::GetValuesOrEntries (RecyclableObject* object, bool valuesToReturn, ScriptContext* scriptContext)
1100
+ {
1101
+ Assert (object != nullptr );
1102
+ Assert (scriptContext != nullptr );
1103
+ JavascriptArray* valuesArray = scriptContext->GetLibrary ()->CreateArray (0 );
1104
+
1105
+ Var ownKeysVar = JavascriptOperators::GetOwnPropertyNames (object, scriptContext);
1106
+ JavascriptArray* ownKeysResult = nullptr ;
1107
+ if (JavascriptArray::Is (ownKeysVar))
1108
+ {
1109
+ ownKeysResult = JavascriptArray::FromVar (ownKeysVar);
1110
+ }
1111
+ else
1112
+ {
1113
+ return valuesArray;
1114
+ }
1115
+
1116
+ uint32 length = ownKeysResult->GetLength ();
1117
+
1118
+ Var nextKey;
1119
+ const PropertyRecord* propertyRecord = nullptr ;
1120
+ PropertyId propertyId;
1121
+ for (uint32 i = 0 , index = 0 ; i < length; i++)
1122
+ {
1123
+ nextKey = ownKeysResult->DirectGetItem (i);
1124
+ Assert (JavascriptString::Is (nextKey));
1125
+
1126
+ PropertyDescriptor propertyDescriptor;
1127
+
1128
+ BOOL propertyKeyResult = JavascriptConversion::ToPropertyKey (nextKey, scriptContext, &propertyRecord);
1129
+ Assert (propertyKeyResult);
1130
+ propertyId = propertyRecord->GetPropertyId ();
1131
+ Assert (propertyId != Constants::NoProperty);
1132
+ if (JavascriptOperators::GetOwnPropertyDescriptor (object, propertyId, scriptContext, &propertyDescriptor))
1133
+ {
1134
+ if (propertyDescriptor.IsEnumerable ())
1135
+ {
1136
+ Var value = JavascriptOperators::GetProperty (object, propertyId, scriptContext);
1137
+ if (!valuesToReturn)
1138
+ {
1139
+ // For Object.entries each entry is key, value pair
1140
+ JavascriptArray* entry = scriptContext->GetLibrary ()->CreateArray (2 );
1141
+ entry->DirectSetItemAt (0 , CrossSite::MarshalVar (scriptContext, nextKey));
1142
+ entry->DirectSetItemAt (1 , CrossSite::MarshalVar (scriptContext, value));
1143
+ value = entry;
1144
+ }
1145
+ valuesArray->DirectSetItemAt (index++, CrossSite::MarshalVar (scriptContext, value));
1146
+ }
1147
+ }
1148
+ }
1149
+
1150
+ return valuesArray;
1151
+ }
1152
+
1153
+ Var JavascriptObject::EntryValues (RecyclableObject* function, CallInfo callInfo, ...)
1154
+ {
1155
+ PROBE_STACK (function->GetScriptContext (), Js::Constants::MinStackDefault);
1156
+
1157
+ ARGUMENTS (args, callInfo);
1158
+ ScriptContext* scriptContext = function->GetScriptContext ();
1159
+
1160
+ Assert (!(callInfo.Flags & CallFlags_New));
1161
+ CHAKRATEL_LANGSTATS_INC_BUILTINCOUNT (ObjectValuesCount);
1162
+
1163
+ Var tempVar = args.Info .Count < 2 ? scriptContext->GetLibrary ()->GetUndefined () : args[1 ];
1164
+ RecyclableObject *object = RecyclableObject::FromVar (JavascriptOperators::ToObject (tempVar, scriptContext));
1165
+
1166
+ return GetValuesOrEntries (object, true /* valuesToReturn*/ , scriptContext);
1167
+ }
1168
+
1169
+ Var JavascriptObject::EntryEntries (RecyclableObject* function, CallInfo callInfo, ...)
1170
+ {
1171
+ PROBE_STACK (function->GetScriptContext (), Js::Constants::MinStackDefault);
1172
+
1173
+ ARGUMENTS (args, callInfo);
1174
+ ScriptContext* scriptContext = function->GetScriptContext ();
1175
+
1176
+ Assert (!(callInfo.Flags & CallFlags_New));
1177
+ CHAKRATEL_LANGSTATS_INC_BUILTINCOUNT (ObjectEntriesCount);
1178
+
1179
+ Var tempVar = args.Info .Count < 2 ? scriptContext->GetLibrary ()->GetUndefined () : args[1 ];
1180
+ RecyclableObject *object = RecyclableObject::FromVar (JavascriptOperators::ToObject (tempVar, scriptContext));
1181
+
1182
+ return GetValuesOrEntries (object, false /* valuesToReturn*/ , scriptContext);
1183
+ }
1184
+
1099
1185
Var JavascriptObject::CreateOwnSymbolPropertiesHelper (RecyclableObject* object, ScriptContext* scriptContext)
1100
1186
{
1101
1187
return CreateKeysHelper (object, scriptContext, TRUE , true /* includeSymbolsOnly */ , false , true /* includeSpecialProperties*/ );
0 commit comments