@@ -100,6 +100,26 @@ namespace Js
100100 {
101101 return ;
102102 }
103+
104+ struct AutoRestoreFlags
105+ {
106+ ThreadContext * ctx;
107+ ImplicitCallFlags savedImplicitCallFlags;
108+ DisableImplicitFlags savedDisableImplicitFlags;
109+ AutoRestoreFlags (ThreadContext *ctx, Js::ImplicitCallFlags implFlags, DisableImplicitFlags disableImplFlags) :
110+ ctx (ctx),
111+ savedImplicitCallFlags (implFlags),
112+ savedDisableImplicitFlags (disableImplFlags)
113+ {
114+ ctx->ClearDisableImplicitFlags ();
115+ }
116+
117+ ~AutoRestoreFlags ()
118+ {
119+ ctx->SetImplicitCallFlags ((Js::ImplicitCallFlags)(savedImplicitCallFlags));
120+ ctx->SetDisableImplicitFlags ((DisableImplicitFlags)savedDisableImplicitFlags);
121+ }
122+ };
103123
104124 try {
105125 EnsureJsBuiltInByteCode (scriptContext);
@@ -138,19 +158,19 @@ namespace Js
138158 scriptContext->GetThreadContext ()->SetNoJsReentrancy (false );
139159#endif
140160 // Clear disable implicit call bit as initialization code doesn't have any side effect
141- Js::ImplicitCallFlags saveImplicitCallFlags = scriptContext-> GetThreadContext ()-> GetImplicitCallFlags ();
142- scriptContext->GetThreadContext ()-> ClearDisableImplicitFlags ( );
143- JavascriptFunction::CallRootFunctionInScript (functionGlobal, Js::Arguments (callInfo, args));
144- scriptContext-> GetThreadContext ()-> SetImplicitCallFlags ((Js::ImplicitCallFlags)(saveImplicitCallFlags));
161+ {
162+ AutoRestoreFlags autoRestoreFlags ( scriptContext->GetThreadContext (), scriptContext-> GetThreadContext ()-> GetImplicitCallFlags (), scriptContext-> GetThreadContext ()-> GetDisableImplicitFlags () );
163+ JavascriptFunction::CallRootFunctionInScript (functionGlobal, Js::Arguments (callInfo, args));
164+ }
145165
146166 Js::ScriptFunction *functionBuiltins = scriptContext->GetLibrary ()->CreateScriptFunction (jsBuiltInByteCode->GetNestedFunctionForExecution (0 ));
147167 functionBuiltins->SetPrototype (scriptContext->GetLibrary ()->nullValue );
148168
149169 // Clear disable implicit call bit as initialization code doesn't have any side effect
150- saveImplicitCallFlags = scriptContext-> GetThreadContext ()-> GetImplicitCallFlags ();
151- scriptContext->GetThreadContext ()-> ClearDisableImplicitFlags ( );
152- JavascriptFunction::CallRootFunctionInScript (functionBuiltins, Js::Arguments (callInfo, args));
153- scriptContext-> GetThreadContext ()-> SetImplicitCallFlags ((Js::ImplicitCallFlags)(saveImplicitCallFlags));
170+ {
171+ AutoRestoreFlags autoRestoreFlags ( scriptContext->GetThreadContext (), scriptContext-> GetThreadContext ()-> GetImplicitCallFlags (), scriptContext-> GetThreadContext ()-> GetDisableImplicitFlags () );
172+ JavascriptFunction::CallRootFunctionInScript (functionBuiltins, Js::Arguments (callInfo, args));
173+ }
154174
155175 InitializePrototypes (scriptContext);
156176#if DBG_DUMP
0 commit comments