Var JavascriptError::NewInstance(RecyclableObject* function, JavascriptError* pError, CallInfo callInfo, Var newTarget, Var message) { ScriptContext* scriptContext = function->GetScriptContext(); bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && newTarget != nullptr && !JavascriptOperators::IsUndefined(newTarget); JavascriptString* messageString = nullptr; if (JavascriptOperators::GetTypeId(message) != TypeIds_Undefined) { messageString = JavascriptConversion::ToString(message, scriptContext); } if (messageString) { JavascriptOperators::SetProperty(pError, pError, PropertyIds::message, messageString, scriptContext); pError->SetNotEnumerable(PropertyIds::message); } JavascriptExceptionContext exceptionContext; JavascriptExceptionOperators::WalkStackForExceptionContext(*scriptContext, exceptionContext, pError, JavascriptExceptionOperators::StackCrawlLimitOnThrow(pError, *scriptContext), /*returnAddress=*/ nullptr, /*isThrownException=*/ false, /*resetSatck=*/ false); JavascriptExceptionOperators::AddStackTraceToObject(pError, exceptionContext.GetStackTrace(), *scriptContext, /*isThrownException=*/ false, /*resetSatck=*/ false); return isCtorSuperCall ? JavascriptOperators::OrdinaryCreateFromConstructor(RecyclableObject::FromVar(newTarget), pError, nullptr, scriptContext) : pError; }
Var JavascriptError::NewInstance(RecyclableObject* function, JavascriptError* pError, CallInfo callInfo, Arguments args) { ScriptContext* scriptContext = function->GetScriptContext(); AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); Var newTarget = callInfo.Flags & CallFlags_NewTarget ? args.Values[args.Info.Count] : args[0]; bool isCtorSuperCall = (callInfo.Flags & CallFlags_New) && (callInfo.Flags & (CallFlags_Value|CallFlags_NewTarget)) && newTarget != nullptr && RecyclableObject::Is(newTarget); JavascriptString* messageString = nullptr; if (args.Info.Count >= 2 && !JavascriptOperators::GetTypeId(args[1]) == TypeIds_Undefined) { messageString = JavascriptConversion::ToString(args[1], scriptContext); } if (messageString) { JavascriptOperators::SetProperty(pError, pError, PropertyIds::message, messageString, scriptContext); pError->SetNotEnumerable(PropertyIds::message); } JavascriptExceptionContext exceptionContext; JavascriptExceptionOperators::WalkStackForExceptionContext(*scriptContext, exceptionContext, pError, JavascriptExceptionOperators::StackCrawlLimitOnThrow(pError, *scriptContext), /*returnAddress=*/ nullptr, /*isThrownException=*/ false, /*resetSatck=*/ false); JavascriptExceptionOperators::AddStackTraceToObject(pError, exceptionContext.GetStackTrace(), *scriptContext, /*isThrownException=*/ false, /*resetSatck=*/ false); return isCtorSuperCall ? JavascriptOperators::OrdinaryCreateFromConstructor(RecyclableObject::FromVar(newTarget), pError, nullptr, scriptContext) : pError; }