diff --git a/lib/Backend/GlobOptFields.cpp b/lib/Backend/GlobOptFields.cpp index dbef6cd6898..318ce50d893 100644 --- a/lib/Backend/GlobOptFields.cpp +++ b/lib/Backend/GlobOptFields.cpp @@ -447,6 +447,15 @@ GlobOpt::ProcessFieldKills(IR::Instr *instr, BVSparse *bv, bo } break; + case Js::OpCode::InitClass: + case Js::OpCode::InitProto: + case Js::OpCode::NewScObjectNoCtor: + if (inGlobOpt) + { + KillObjectHeaderInlinedTypeSyms(this->currentBlock, false); + } + break; + default: if (instr->UsesAllFields()) { diff --git a/lib/Runtime/Library/JsBuiltInEngineInterfaceExtensionObject.cpp b/lib/Runtime/Library/JsBuiltInEngineInterfaceExtensionObject.cpp index f5c0812bae3..fe552c77018 100644 --- a/lib/Runtime/Library/JsBuiltInEngineInterfaceExtensionObject.cpp +++ b/lib/Runtime/Library/JsBuiltInEngineInterfaceExtensionObject.cpp @@ -131,6 +131,26 @@ namespace Js return; } + struct AutoRestoreFlags + { + ThreadContext * ctx; + ImplicitCallFlags savedImplicitCallFlags; + DisableImplicitFlags savedDisableImplicitFlags; + AutoRestoreFlags(ThreadContext *ctx, Js::ImplicitCallFlags implFlags, DisableImplicitFlags disableImplFlags) : + ctx(ctx), + savedImplicitCallFlags(implFlags), + savedDisableImplicitFlags(disableImplFlags) + { + ctx->ClearDisableImplicitFlags(); + } + + ~AutoRestoreFlags() + { + ctx->SetImplicitCallFlags((Js::ImplicitCallFlags)(savedImplicitCallFlags)); + ctx->SetDisableImplicitFlags((DisableImplicitFlags)savedDisableImplicitFlags); + } + }; + try { EnsureJsBuiltInByteCode(scriptContext); Assert(jsBuiltInByteCode != nullptr); @@ -168,19 +188,19 @@ namespace Js scriptContext->GetThreadContext()->SetNoJsReentrancy(false); #endif // Clear disable implicit call bit as initialization code doesn't have any side effect - Js::ImplicitCallFlags saveImplicitCallFlags = scriptContext->GetThreadContext()->GetImplicitCallFlags(); - scriptContext->GetThreadContext()->ClearDisableImplicitFlags(); - JavascriptFunction::CallRootFunctionInScript(functionGlobal, Js::Arguments(callInfo, args)); - scriptContext->GetThreadContext()->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags)); + { + AutoRestoreFlags autoRestoreFlags(scriptContext->GetThreadContext(), scriptContext->GetThreadContext()->GetImplicitCallFlags(), scriptContext->GetThreadContext()->GetDisableImplicitFlags()); + JavascriptFunction::CallRootFunctionInScript(functionGlobal, Js::Arguments(callInfo, args)); + } Js::ScriptFunction *functionBuiltins = scriptContext->GetLibrary()->CreateScriptFunction(jsBuiltInByteCode->GetNestedFunctionForExecution(0)); functionBuiltins->SetPrototype(scriptContext->GetLibrary()->nullValue); // Clear disable implicit call bit as initialization code doesn't have any side effect - saveImplicitCallFlags = scriptContext->GetThreadContext()->GetImplicitCallFlags(); - scriptContext->GetThreadContext()->ClearDisableImplicitFlags(); - JavascriptFunction::CallRootFunctionInScript(functionBuiltins, Js::Arguments(callInfo, args)); - scriptContext->GetThreadContext()->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags)); + { + AutoRestoreFlags autoRestoreFlags(scriptContext->GetThreadContext(), scriptContext->GetThreadContext()->GetImplicitCallFlags(), scriptContext->GetThreadContext()->GetDisableImplicitFlags()); + JavascriptFunction::CallRootFunctionInScript(functionBuiltins, Js::Arguments(callInfo, args)); + } InitializePrototypes(scriptContext); #if DBG_DUMP