@@ -131,6 +131,26 @@ namespace Js
131131 return ;
132132 }
133133
134+ struct AutoRestoreFlags
135+ {
136+ ThreadContext * ctx;
137+ ImplicitCallFlags savedImplicitCallFlags;
138+ DisableImplicitFlags savedDisableImplicitFlags;
139+ AutoRestoreFlags (ThreadContext *ctx, Js::ImplicitCallFlags implFlags, DisableImplicitFlags disableImplFlags) :
140+ ctx (ctx),
141+ savedImplicitCallFlags (implFlags),
142+ savedDisableImplicitFlags (disableImplFlags)
143+ {
144+ ctx->ClearDisableImplicitFlags ();
145+ }
146+
147+ ~AutoRestoreFlags ()
148+ {
149+ ctx->SetImplicitCallFlags ((Js::ImplicitCallFlags)(savedImplicitCallFlags));
150+ ctx->SetDisableImplicitFlags ((DisableImplicitFlags)savedDisableImplicitFlags);
151+ }
152+ };
153+
134154 try {
135155 EnsureJsBuiltInByteCode (scriptContext);
136156 Assert (jsBuiltInByteCode != nullptr );
@@ -168,19 +188,19 @@ namespace Js
168188 scriptContext->GetThreadContext ()->SetNoJsReentrancy (false );
169189#endif
170190 // Clear disable implicit call bit as initialization code doesn't have any side effect
171- Js::ImplicitCallFlags saveImplicitCallFlags = scriptContext-> GetThreadContext ()-> GetImplicitCallFlags ();
172- scriptContext->GetThreadContext ()-> ClearDisableImplicitFlags ( );
173- JavascriptFunction::CallRootFunctionInScript (functionGlobal, Js::Arguments (callInfo, args));
174- scriptContext-> GetThreadContext ()-> SetImplicitCallFlags ((Js::ImplicitCallFlags)(saveImplicitCallFlags));
191+ {
192+ AutoRestoreFlags autoRestoreFlags ( scriptContext->GetThreadContext (), scriptContext-> GetThreadContext ()-> GetImplicitCallFlags (), scriptContext-> GetThreadContext ()-> GetDisableImplicitFlags () );
193+ JavascriptFunction::CallRootFunctionInScript (functionGlobal, Js::Arguments (callInfo, args));
194+ }
175195
176196 Js::ScriptFunction *functionBuiltins = scriptContext->GetLibrary ()->CreateScriptFunction (jsBuiltInByteCode->GetNestedFunctionForExecution (0 ));
177197 functionBuiltins->SetPrototype (scriptContext->GetLibrary ()->nullValue );
178198
179199 // Clear disable implicit call bit as initialization code doesn't have any side effect
180- saveImplicitCallFlags = scriptContext-> GetThreadContext ()-> GetImplicitCallFlags ();
181- scriptContext->GetThreadContext ()-> ClearDisableImplicitFlags ( );
182- JavascriptFunction::CallRootFunctionInScript (functionBuiltins, Js::Arguments (callInfo, args));
183- scriptContext-> GetThreadContext ()-> SetImplicitCallFlags ((Js::ImplicitCallFlags)(saveImplicitCallFlags));
200+ {
201+ AutoRestoreFlags autoRestoreFlags ( scriptContext->GetThreadContext (), scriptContext-> GetThreadContext ()-> GetImplicitCallFlags (), scriptContext-> GetThreadContext ()-> GetDisableImplicitFlags () );
202+ JavascriptFunction::CallRootFunctionInScript (functionBuiltins, Js::Arguments (callInfo, args));
203+ }
184204
185205 InitializePrototypes (scriptContext);
186206#if DBG_DUMP
0 commit comments