@@ -72,6 +72,7 @@ Var JavascriptMap::NewInstance(RecyclableObject* function, CallInfo callInfo, ..
72
72
// REVIEW: This condition seems impossible?
73
73
if (mapObject->kind != MapKind::EmptyMap)
74
74
{
75
+ Assert (UNREACHED);
75
76
JavascriptError::ThrowTypeErrorVar (scriptContext, JSERR_ObjectIsAlreadyInitialized, _u (" Map" ), _u (" Map" ));
76
77
}
77
78
@@ -130,13 +131,12 @@ Var JavascriptMap::EntryClear(RecyclableObject* function, CallInfo callInfo, ...
130
131
ARGUMENTS (args, callInfo);
131
132
ScriptContext* scriptContext = function->GetScriptContext ();
132
133
133
- if (!JavascriptMap::Is (args[0 ]))
134
+ JavascriptMap* map = JavascriptOperators::TryFromVar<JavascriptMap>(args[0 ]);
135
+ if (map == nullptr )
134
136
{
135
137
JavascriptError::ThrowTypeErrorVar (scriptContext, JSERR_NeedObjectOfType, _u (" Map.prototype.clear" ), _u (" Map" ));
136
138
}
137
139
138
- JavascriptMap* map = JavascriptMap::FromVar (args[0 ]);
139
-
140
140
map->Clear ();
141
141
142
142
return scriptContext->GetLibrary ()->GetUndefined ();
@@ -149,13 +149,12 @@ Var JavascriptMap::EntryDelete(RecyclableObject* function, CallInfo callInfo, ..
149
149
ARGUMENTS (args, callInfo);
150
150
ScriptContext* scriptContext = function->GetScriptContext ();
151
151
152
- if (!JavascriptMap::Is (args[0 ]))
152
+ JavascriptMap* map = JavascriptOperators::TryFromVar<JavascriptMap>(args[0 ]);
153
+ if (map == nullptr )
153
154
{
154
155
JavascriptError::ThrowTypeErrorVar (scriptContext, JSERR_NeedObjectOfType, _u (" Map.prototype.delete" ), _u (" Map" ));
155
156
}
156
157
157
- JavascriptMap* map = JavascriptMap::FromVar (args[0 ]);
158
-
159
158
Var key = (args.Info .Count > 1 ) ? args[1 ] : scriptContext->GetLibrary ()->GetUndefined ();
160
159
161
160
bool didDelete = map->Delete (key);
@@ -171,13 +170,12 @@ Var JavascriptMap::EntryForEach(RecyclableObject* function, CallInfo callInfo, .
171
170
ScriptContext* scriptContext = function->GetScriptContext ();
172
171
AUTO_TAG_NATIVE_LIBRARY_ENTRY (function, callInfo, _u (" Map.prototype.forEach" ));
173
172
174
- if (!JavascriptMap::Is (args[0 ]))
173
+ JavascriptMap* map = JavascriptOperators::TryFromVar<JavascriptMap>(args[0 ]);
174
+ if (map == nullptr )
175
175
{
176
176
JavascriptError::ThrowTypeErrorVar (scriptContext, JSERR_NeedObjectOfType, _u (" Map.prototype.forEach" ), _u (" Map" ));
177
177
}
178
178
179
- JavascriptMap* map = JavascriptMap::FromVar (args[0 ]);
180
-
181
179
if (args.Info .Count < 2 || !JavascriptConversion::IsCallable (args[1 ]))
182
180
{
183
181
JavascriptError::ThrowTypeError (scriptContext, JSERR_FunctionArgument_NeedFunction, _u (" Map.prototype.forEach" ));
@@ -206,13 +204,12 @@ Var JavascriptMap::EntryGet(RecyclableObject* function, CallInfo callInfo, ...)
206
204
ARGUMENTS (args, callInfo);
207
205
ScriptContext* scriptContext = function->GetScriptContext ();
208
206
209
- if (!JavascriptMap::Is (args[0 ]))
207
+ JavascriptMap* map = JavascriptOperators::TryFromVar<JavascriptMap>(args[0 ]);
208
+ if (map == nullptr )
210
209
{
211
210
JavascriptError::ThrowTypeErrorVar (scriptContext, JSERR_NeedObjectOfType, _u (" Map.prototype.get" ), _u (" Map" ));
212
211
}
213
212
214
- JavascriptMap* map = JavascriptMap::FromVar (args[0 ]);
215
-
216
213
Var key = (args.Info .Count > 1 ) ? args[1 ] : scriptContext->GetLibrary ()->GetUndefined ();
217
214
Var value = nullptr ;
218
215
@@ -231,13 +228,12 @@ Var JavascriptMap::EntryHas(RecyclableObject* function, CallInfo callInfo, ...)
231
228
ARGUMENTS (args, callInfo);
232
229
ScriptContext* scriptContext = function->GetScriptContext ();
233
230
234
- if (!JavascriptMap::Is (args[0 ]))
231
+ JavascriptMap* map = JavascriptOperators::TryFromVar<JavascriptMap>(args[0 ]);
232
+ if (map == nullptr )
235
233
{
236
234
JavascriptError::ThrowTypeErrorVar (scriptContext, JSERR_NeedObjectOfType, _u (" Map.prototype.has" ), _u (" Map" ));
237
235
}
238
236
239
- JavascriptMap* map = JavascriptMap::FromVar (args[0 ]);
240
-
241
237
Var key = (args.Info .Count > 1 ) ? args[1 ] : scriptContext->GetLibrary ()->GetUndefined ();
242
238
243
239
bool hasValue = map->Has (key);
@@ -252,13 +248,12 @@ Var JavascriptMap::EntrySet(RecyclableObject* function, CallInfo callInfo, ...)
252
248
ARGUMENTS (args, callInfo);
253
249
ScriptContext* scriptContext = function->GetScriptContext ();
254
250
255
- if (!JavascriptMap::Is (args[0 ]))
251
+ JavascriptMap* map = JavascriptOperators::TryFromVar<JavascriptMap>(args[0 ]);
252
+ if (map == nullptr )
256
253
{
257
254
JavascriptError::ThrowTypeErrorVar (scriptContext, JSERR_NeedObjectOfType, _u (" Map.prototype.set" ), _u (" Map" ));
258
255
}
259
256
260
- JavascriptMap* map = JavascriptMap::FromVar (args[0 ]);
261
-
262
257
Var key = (args.Info .Count > 1 ) ? args[1 ] : scriptContext->GetLibrary ()->GetUndefined ();
263
258
Var value = (args.Info .Count > 2 ) ? args[2 ] : scriptContext->GetLibrary ()->GetUndefined ();
264
259
@@ -280,13 +275,12 @@ Var JavascriptMap::EntrySizeGetter(RecyclableObject* function, CallInfo callInfo
280
275
ARGUMENTS (args, callInfo);
281
276
ScriptContext* scriptContext = function->GetScriptContext ();
282
277
283
- if (!JavascriptMap::Is (args[0 ]))
278
+ JavascriptMap* map = JavascriptOperators::TryFromVar<JavascriptMap>(args[0 ]);
279
+ if (map == nullptr )
284
280
{
285
281
JavascriptError::ThrowTypeErrorVar (scriptContext, JSERR_NeedObjectOfType, _u (" Map.prototype.size" ), _u (" Map" ));
286
282
}
287
283
288
- JavascriptMap* map = JavascriptMap::FromVar (args[0 ]);
289
-
290
284
int size = map->Size ();
291
285
292
286
return JavascriptNumber::ToVar (size, scriptContext);
@@ -299,13 +293,12 @@ Var JavascriptMap::EntryEntries(RecyclableObject* function, CallInfo callInfo, .
299
293
ARGUMENTS (args, callInfo);
300
294
ScriptContext* scriptContext = function->GetScriptContext ();
301
295
302
- if (!JavascriptMap::Is (args[0 ]))
296
+ JavascriptMap* map = JavascriptOperators::TryFromVar<JavascriptMap>(args[0 ]);
297
+ if (map == nullptr )
303
298
{
304
299
JavascriptError::ThrowTypeErrorVar (scriptContext, JSERR_NeedObjectOfType, _u (" Map.prototype.entries" ), _u (" Map" ));
305
300
}
306
301
307
- JavascriptMap* map = JavascriptMap::FromVar (args[0 ]);
308
-
309
302
return scriptContext->GetLibrary ()->CreateMapIterator (map, JavascriptMapIteratorKind::KeyAndValue);
310
303
}
311
304
@@ -316,13 +309,12 @@ Var JavascriptMap::EntryKeys(RecyclableObject* function, CallInfo callInfo, ...)
316
309
ARGUMENTS (args, callInfo);
317
310
ScriptContext* scriptContext = function->GetScriptContext ();
318
311
319
- if (!JavascriptMap::Is (args[0 ]))
312
+ JavascriptMap* map = JavascriptOperators::TryFromVar<JavascriptMap>(args[0 ]);
313
+ if (map == nullptr )
320
314
{
321
315
JavascriptError::ThrowTypeErrorVar (scriptContext, JSERR_NeedObjectOfType, _u (" Map.prototype.keys" ), _u (" Map" ));
322
316
}
323
317
324
- JavascriptMap* map = JavascriptMap::FromVar (args[0 ]);
325
-
326
318
return scriptContext->GetLibrary ()->CreateMapIterator (map, JavascriptMapIteratorKind::Key);
327
319
}
328
320
@@ -333,18 +325,18 @@ Var JavascriptMap::EntryValues(RecyclableObject* function, CallInfo callInfo, ..
333
325
ARGUMENTS (args, callInfo);
334
326
ScriptContext* scriptContext = function->GetScriptContext ();
335
327
336
- if (!JavascriptMap::Is (args[0 ]))
328
+ JavascriptMap* map = JavascriptOperators::TryFromVar<JavascriptMap>(args[0 ]);
329
+ if (map == nullptr )
337
330
{
338
331
JavascriptError::ThrowTypeErrorVar (scriptContext, JSERR_NeedObjectOfType, _u (" Map.prototype.values" ), _u (" Map" ));
339
332
}
340
-
341
- JavascriptMap* map = JavascriptMap::FromVar (args[0 ]);
342
333
return scriptContext->GetLibrary ()->CreateMapIterator (map, JavascriptMapIteratorKind::Value);
343
334
}
344
335
345
336
void
346
337
JavascriptMap::Clear ()
347
338
{
339
+ JS_REENTRANCY_LOCK (jsReentLock, this ->GetScriptContext ()->GetThreadContext ());
348
340
list.Clear ();
349
341
switch (this ->kind )
350
342
{
@@ -392,6 +384,7 @@ JavascriptMap::DeleteFromSimpleVarMap(Var value)
392
384
bool
393
385
JavascriptMap::Delete (Var key)
394
386
{
387
+ JS_REENTRANCY_LOCK (jsReentLock, this ->GetScriptContext ()->GetThreadContext ());
395
388
switch (this ->kind )
396
389
{
397
390
case MapKind::EmptyMap:
@@ -410,6 +403,7 @@ JavascriptMap::Delete(Var key)
410
403
bool
411
404
JavascriptMap::Get (Var key, Var* value)
412
405
{
406
+ JS_REENTRANCY_LOCK (jsReentLock, this ->GetScriptContext ()->GetThreadContext ());
413
407
switch (this ->kind )
414
408
{
415
409
case MapKind::EmptyMap:
@@ -453,13 +447,13 @@ JavascriptMap::Get(Var key, Var* value)
453
447
Assume (UNREACHED);
454
448
return false ;
455
449
}
456
-
457
- return false ;
458
450
}
459
451
452
+
460
453
bool
461
454
JavascriptMap::Has (Var key)
462
455
{
456
+ JS_REENTRANCY_LOCK (jsReentLock, this ->GetScriptContext ()->GetThreadContext ());
463
457
switch (this ->kind )
464
458
{
465
459
case MapKind::EmptyMap:
@@ -497,7 +491,7 @@ JavascriptMap::PromoteToComplexVarMap()
497
491
AssertOrFailFast (this ->kind == MapKind::SimpleVarMap);
498
492
499
493
uint newMapSize = this ->u .simpleVarMap ->Count () + 1 ;
500
- ComplexVarDataMap* newMap = RecyclerNew (GetRecycler (), ComplexVarDataMap, GetRecycler (), newMapSize);
494
+ ComplexVarDataMap* newMap = RecyclerNew (this -> GetRecycler (), ComplexVarDataMap, this -> GetRecycler (), newMapSize);
501
495
502
496
JavascriptMap::MapDataList::Iterator iter = this ->list .GetIterator ();
503
497
// TODO: we can use a more efficient Iterator, since we know there will be no side effects
@@ -516,10 +510,10 @@ JavascriptMap::SetOnEmptyMap(Var key, Var value)
516
510
Var simpleVar = JavascriptConversion::TryCanonicalizeAsSimpleVar (key);
517
511
if (simpleVar)
518
512
{
519
- SimpleVarDataMap* newSimpleMap = RecyclerNew (GetRecycler (), SimpleVarDataMap, GetRecycler ());
513
+ SimpleVarDataMap* newSimpleMap = RecyclerNew (this -> GetRecycler (), SimpleVarDataMap, this -> GetRecycler ());
520
514
MapDataKeyValuePair simplePair (simpleVar, value);
521
515
522
- MapDataNode* node = this ->list .Append (simplePair, GetScriptContext () ->GetRecycler ());
516
+ MapDataNode* node = this ->list .Append (simplePair, this ->GetRecycler ());
523
517
524
518
newSimpleMap->Add (simpleVar, node);
525
519
@@ -528,12 +522,12 @@ JavascriptMap::SetOnEmptyMap(Var key, Var value)
528
522
return ;
529
523
}
530
524
531
- ComplexVarDataMap* newComplexSet = RecyclerNew (GetRecycler (), ComplexVarDataMap, GetRecycler ());
525
+ ComplexVarDataMap* newComplexSet = RecyclerNew (this -> GetRecycler (), ComplexVarDataMap, this -> GetRecycler ());
532
526
MapDataKeyValuePair complexPair (key, value);
533
527
534
- MapDataNode* node = this ->list .Append (complexPair, GetScriptContext () ->GetRecycler ());
528
+ MapDataNode* node = this ->list .Append (complexPair, this ->GetRecycler ());
535
529
536
- newComplexSet->Add (value , node);
530
+ newComplexSet->Add (key , node);
537
531
538
532
this ->u .complexVarMap = newComplexSet;
539
533
this ->kind = MapKind::ComplexVarMap;
@@ -556,7 +550,7 @@ JavascriptMap::TrySetOnSimpleVarMap(Var key, Var value)
556
550
}
557
551
558
552
MapDataKeyValuePair pair (simpleVar, value);
559
- MapDataNode* newNode = this ->list .Append (pair, GetScriptContext () ->GetRecycler ());
553
+ MapDataNode* newNode = this ->list .Append (pair, this ->GetRecycler ());
560
554
this ->u .simpleVarMap ->Add (simpleVar, newNode);
561
555
return true ;
562
556
}
@@ -572,13 +566,14 @@ JavascriptMap::SetOnComplexVarMap(Var key, Var value)
572
566
}
573
567
574
568
MapDataKeyValuePair pair (key, value);
575
- MapDataNode* newNode = this ->list .Append (pair, GetScriptContext () ->GetRecycler ());
569
+ MapDataNode* newNode = this ->list .Append (pair, this ->GetRecycler ());
576
570
this ->u .complexVarMap ->Add (key, newNode);
577
571
}
578
572
579
573
void
580
574
JavascriptMap::Set (Var key, Var value)
581
575
{
576
+ JS_REENTRANCY_LOCK (jsReentLock, this ->GetScriptContext ()->GetThreadContext ());
582
577
switch (this ->kind )
583
578
{
584
579
case MapKind::EmptyMap:
@@ -604,6 +599,7 @@ JavascriptMap::Set(Var key, Var value)
604
599
605
600
int JavascriptMap::Size ()
606
601
{
602
+ JS_REENTRANCY_LOCK (jsReentLock, this ->GetScriptContext ()->GetThreadContext ());
607
603
switch (this ->kind )
608
604
{
609
605
case MapKind::EmptyMap:
0 commit comments