diff --git a/lib/Runtime/Base/ThreadContext.h b/lib/Runtime/Base/ThreadContext.h index 8a39ff199b3..21bc7b1ed46 100644 --- a/lib/Runtime/Base/ThreadContext.h +++ b/lib/Runtime/Base/ThreadContext.h @@ -1635,11 +1635,27 @@ class ThreadContext sealed : } // Save and restore implicit flags around the implicit call + struct RestoreFlags + { + ThreadContext * const ctx; + const Js::ImplicitCallFlags flags; + const Js::ImplicitCallFlags savedFlags; + + RestoreFlags(ThreadContext *ctx, Js::ImplicitCallFlags flags) : + ctx(ctx), + flags(flags), + savedFlags(ctx->GetImplicitCallFlags()) + { + } + + ~RestoreFlags() + { + ctx->SetImplicitCallFlags(static_cast(savedFlags | flags)); + } + }; - Js::ImplicitCallFlags saveImplicitCallFlags = this->GetImplicitCallFlags(); - Js::Var result = implicitCall(); - this->SetImplicitCallFlags((Js::ImplicitCallFlags)(saveImplicitCallFlags | flags)); - return result; + RestoreFlags restoreFlags(this, flags); + return implicitCall(); } bool HasNoSideEffect(Js::RecyclableObject * function) const; bool HasNoSideEffect(Js::RecyclableObject * function, Js::FunctionInfo::Attributes attr) const;