@@ -131,6 +131,26 @@ namespace Js
131
131
return ;
132
132
}
133
133
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
+
134
154
try {
135
155
EnsureJsBuiltInByteCode (scriptContext);
136
156
Assert (jsBuiltInByteCode != nullptr );
@@ -168,19 +188,19 @@ namespace Js
168
188
scriptContext->GetThreadContext ()->SetNoJsReentrancy (false );
169
189
#endif
170
190
// 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
+ }
175
195
176
196
Js::ScriptFunction *functionBuiltins = scriptContext->GetLibrary ()->CreateScriptFunction (jsBuiltInByteCode->GetNestedFunctionForExecution (0 ));
177
197
functionBuiltins->SetPrototype (scriptContext->GetLibrary ()->nullValue );
178
198
179
199
// 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
+ }
184
204
185
205
InitializePrototypes (scriptContext);
186
206
#if DBG_DUMP
0 commit comments