Var JavascriptWeakMap::EntrySet(RecyclableObject* function, CallInfo callInfo, ...) { PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); if (!JavascriptWeakMap::Is(args[0])) { JavascriptError::ThrowTypeErrorVar(scriptContext, JSERR_NeedObjectOfType, _u("WeakMap.prototype.set"), _u("WeakMap")); } JavascriptWeakMap* weakMap = JavascriptWeakMap::FromVar(args[0]); Var key = (args.Info.Count > 1) ? args[1] : scriptContext->GetLibrary()->GetUndefined(); Var value = (args.Info.Count > 2) ? args[2] : scriptContext->GetLibrary()->GetUndefined(); if (!JavascriptOperators::IsObject(key) || JavascriptOperators::GetTypeId(key) == TypeIds_HostDispatch) { // HostDispatch can not expand so can't have internal property added to it. // TODO: Support HostDispatch as WeakMap key JavascriptError::ThrowTypeError(scriptContext, JSERR_WeakMapSetKeyNotAnObject, _u("WeakMap.prototype.set")); } DynamicObject* keyObj = DynamicObject::FromVar(key); weakMap->Set(keyObj, value); return weakMap; }
Var JavascriptWeakMap::EntrySet(RecyclableObject* function, CallInfo callInfo, ...) { PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); if (!JavascriptWeakMap::Is(args[0])) { JavascriptError::ThrowTypeErrorVar(scriptContext, JSERR_NeedObjectOfType, _u("WeakMap.prototype.set"), _u("WeakMap")); } JavascriptWeakMap* weakMap = JavascriptWeakMap::FromVar(args[0]); Var key = (args.Info.Count > 1) ? args[1] : scriptContext->GetLibrary()->GetUndefined(); Var value = (args.Info.Count > 2) ? args[2] : scriptContext->GetLibrary()->GetUndefined(); if (!JavascriptOperators::IsObject(key) || JavascriptOperators::GetTypeId(key) == TypeIds_HostDispatch) { // HostDispatch can not expand so can't have internal property added to it. // TODO: Support HostDispatch as WeakMap key JavascriptError::ThrowTypeError(scriptContext, JSERR_WeakMapSetKeyNotAnObject, _u("WeakMap.prototype.set")); } DynamicObject* keyObj = DynamicObject::FromVar(key); #if ENABLE_TTD // //TODO: This makes the map decidedly less weak -- forces it to only release when we clean the tracking set but determinizes the behavior nicely // We want to improve this. // if(scriptContext->ShouldPerformWeakRefPinAction()) { scriptContext->TTDContextInfo->TTDWeakReferencePinSet->Add(keyObj); } #endif weakMap->Set(keyObj, value); return weakMap; }