@@ -24,9 +24,12 @@ namespace Js
2424 return static_cast <JavascriptWeakMap *>(RecyclableObject::FromVar (aValue));
2525 }
2626
27- JavascriptWeakMap::WeakMapKeyMap* JavascriptWeakMap::GetWeakMapKeyMapFromKey (DynamicObject * key) const
27+ JavascriptWeakMap::WeakMapKeyMap* JavascriptWeakMap::GetWeakMapKeyMapFromKey (RecyclableObject * key) const
2828 {
29+ AssertOrFailFast (DynamicType::Is (key->GetTypeId ()) || JavascriptOperators::GetTypeId (key) == TypeIds_HostDispatch);
30+
2931 Var weakMapKeyData = nullptr ;
32+
3033 if (!key->GetInternalProperty (key, InternalPropertyIds::WeakMapKeyMap, &weakMapKeyData, nullptr , key->GetScriptContext ()))
3134 {
3235 return nullptr ;
@@ -42,8 +45,10 @@ namespace Js
4245 return static_cast <WeakMapKeyMap*>(weakMapKeyData);
4346 }
4447
45- JavascriptWeakMap::WeakMapKeyMap* JavascriptWeakMap::AddWeakMapKeyMapToKey (DynamicObject * key)
48+ JavascriptWeakMap::WeakMapKeyMap* JavascriptWeakMap::AddWeakMapKeyMapToKey (RecyclableObject * key)
4649 {
50+ AssertOrFailFast (DynamicType::Is (key->GetTypeId ()) || JavascriptOperators::GetTypeId (key) == TypeIds_HostDispatch);
51+
4752 // The internal property may exist on an object that has had DynamicObject::ResetObject called on itself.
4853 // In that case the value stored in the property slot should be null.
4954 DebugOnly (Var unused = nullptr );
@@ -163,9 +168,9 @@ namespace Js
163168 Var key = (args.Info .Count > 1 ) ? args[1 ] : scriptContext->GetLibrary ()->GetUndefined ();
164169 bool didDelete = false ;
165170
166- if (JavascriptOperators::IsObject (key) && JavascriptOperators::GetTypeId (key) != TypeIds_HostDispatch )
171+ if (JavascriptOperators::IsObject (key))
167172 {
168- DynamicObject * keyObj = DynamicObject ::FromVar (key);
173+ RecyclableObject * keyObj = RecyclableObject ::FromVar (key);
169174
170175 didDelete = weakMap->Delete (keyObj);
171176 }
@@ -205,9 +210,9 @@ namespace Js
205210
206211 bool loaded = false ;
207212 Var value = nullptr ;
208- if (JavascriptOperators::IsObject (key) && JavascriptOperators::GetTypeId (key) != TypeIds_HostDispatch )
213+ if (JavascriptOperators::IsObject (key))
209214 {
210- DynamicObject * keyObj = DynamicObject ::FromVar (key);
215+ RecyclableObject * keyObj = RecyclableObject ::FromVar (key);
211216 loaded = weakMap->Get (keyObj, &value);
212217 }
213218
@@ -245,9 +250,9 @@ namespace Js
245250 Var key = (args.Info .Count > 1 ) ? args[1 ] : scriptContext->GetLibrary ()->GetUndefined ();
246251 bool hasValue = false ;
247252
248- if (JavascriptOperators::IsObject (key) && JavascriptOperators::GetTypeId (key) != TypeIds_HostDispatch )
253+ if (JavascriptOperators::IsObject (key))
249254 {
250- DynamicObject * keyObj = DynamicObject ::FromVar (key);
255+ RecyclableObject * keyObj = RecyclableObject ::FromVar (key);
251256
252257 hasValue = weakMap->Has (keyObj);
253258 }
@@ -286,14 +291,12 @@ namespace Js
286291 Var key = (args.Info .Count > 1 ) ? args[1 ] : scriptContext->GetLibrary ()->GetUndefined ();
287292 Var value = (args.Info .Count > 2 ) ? args[2 ] : scriptContext->GetLibrary ()->GetUndefined ();
288293
289- if (!JavascriptOperators::IsObject (key) || JavascriptOperators::GetTypeId (key) == TypeIds_HostDispatch )
294+ if (!JavascriptOperators::IsObject (key))
290295 {
291- // HostDispatch can not expand so can't have internal property added to it.
292- // TODO: Support HostDispatch as WeakMap key
293296 JavascriptError::ThrowTypeError (scriptContext, JSERR_WeakMapSetKeyNotAnObject, _u (" WeakMap.prototype.set" ));
294297 }
295298
296- DynamicObject * keyObj = DynamicObject ::FromVar (key);
299+ RecyclableObject * keyObj = RecyclableObject ::FromVar (key);
297300
298301#if ENABLE_TTD
299302 // In replay we need to pin the object (and will release at snapshot points) -- in record we don't need to do anything
@@ -310,7 +313,7 @@ namespace Js
310313
311314 void JavascriptWeakMap::Clear ()
312315 {
313- keySet.Map ([&](DynamicObject * key, bool value, const RecyclerWeakReference<DynamicObject >* weakRef) {
316+ keySet.Map ([&](RecyclableObject * key, bool value, const RecyclerWeakReference<RecyclableObject >* weakRef) {
314317 WeakMapKeyMap* keyMap = GetWeakMapKeyMapFromKey (key);
315318
316319 // It may be the case that a CEO has been reset and the keyMap is now null.
@@ -326,7 +329,7 @@ namespace Js
326329 keySet.Clear ();
327330 }
328331
329- bool JavascriptWeakMap::Delete (DynamicObject * key)
332+ bool JavascriptWeakMap::Delete (RecyclableObject * key)
330333 {
331334 WeakMapKeyMap* keyMap = GetWeakMapKeyMapFromKey (key);
332335
@@ -343,7 +346,7 @@ namespace Js
343346 return false ;
344347 }
345348
346- bool JavascriptWeakMap::Get (DynamicObject * key, Var* value) const
349+ bool JavascriptWeakMap::Get (RecyclableObject * key, Var* value) const
347350 {
348351 WeakMapKeyMap* keyMap = GetWeakMapKeyMapFromKey (key);
349352
@@ -355,7 +358,7 @@ namespace Js
355358 return false ;
356359 }
357360
358- bool JavascriptWeakMap::Has (DynamicObject * key) const
361+ bool JavascriptWeakMap::Has (RecyclableObject * key) const
359362 {
360363 WeakMapKeyMap* keyMap = GetWeakMapKeyMapFromKey (key);
361364
@@ -367,7 +370,7 @@ namespace Js
367370 return false ;
368371 }
369372
370- void JavascriptWeakMap::Set (DynamicObject * key, Var value)
373+ void JavascriptWeakMap::Set (RecyclableObject * key, Var value)
371374 {
372375 WeakMapKeyMap* keyMap = GetWeakMapKeyMapFromKey (key);
373376
@@ -393,14 +396,14 @@ namespace Js
393396 Js::ScriptContext* scriptContext = this ->GetScriptContext ();
394397 if (scriptContext->IsTTDReplayModeEnabled ())
395398 {
396- this ->Map ([&](DynamicObject * key, Js::Var value)
399+ this ->Map ([&](RecyclableObject * key, Js::Var value)
397400 {
398401 scriptContext->TTDContextInfo ->TTDWeakReferencePinSet ->AddNew (key);
399402 });
400403 }
401404
402405 // Keys are weak so are always reachable from somewhere else but values are not so we must walk them
403- this ->Map ([&](DynamicObject * key, Js::Var value)
406+ this ->Map ([&](RecyclableObject * key, Js::Var value)
404407 {
405408 extractor->MarkVisitVar (value);
406409 });
@@ -419,7 +422,7 @@ namespace Js
419422 smi->MapSize = 0 ;
420423 smi->MapKeyValueArray = alloc.SlabReserveArraySpace <TTD ::TTDVar>(mapCountEst + 1 ); // always reserve at least 1 element
421424
422- this ->Map ([&](DynamicObject * key, Js::Var value)
425+ this ->Map ([&](RecyclableObject * key, Js::Var value)
423426 {
424427 AssertMsg (smi->MapSize + 1 < mapCountEst, " We are writting junk" );
425428
0 commit comments