diff --git a/dom/base/JSExecutionContext.cpp b/dom/base/JSExecutionContext.cpp index 4fca926134bd..cd6f473de6b6 100644 --- a/dom/base/JSExecutionContext.cpp +++ b/dom/base/JSExecutionContext.cpp @@ -77,9 +77,7 @@ JSExecutionContext::JSExecutionContext( mScript(aCx), mDebuggerPrivateValue(aCx, aDebuggerPrivateValue), mDebuggerIntroductionScript(aCx, aDebuggerIntroductionScript), - mSkip(false), - mCoerceToString(false), - mEncodeBytecode(false) + mSkip(false) #ifdef DEBUG , mWantsReturnValue(false), @@ -101,7 +99,8 @@ JSExecutionContext::JSExecutionContext( void JSExecutionContext::JoinOffThread(JS::CompileOptions& aCompileOptions, ScriptLoadContext* aContext, - ErrorResult& aRv) { + ErrorResult& aRv, + bool aEncodeBytecode /* = false */) { MOZ_ASSERT(!mSkip); MOZ_ASSERT(!mWantsReturnValue); @@ -125,12 +124,13 @@ void JSExecutionContext::JoinOffThread(JS::CompileOptions& aCompileOptions, bool unused; InstantiateStencil(aCompileOptions, std::move(stencil), unused, aRv, - &storage); + aEncodeBytecode, &storage); } template void JSExecutionContext::InternalCompile(JS::CompileOptions& aCompileOptions, JS::SourceText& aSrcBuf, + bool aEncodeBytecode, ErrorResult& aRv) { MOZ_ASSERT(!mSkip); @@ -158,23 +158,27 @@ void JSExecutionContext::InternalCompile(JS::CompileOptions& aCompileOptions, } bool unused; - InstantiateStencil(aCompileOptions, std::move(stencil), unused, aRv); + InstantiateStencil(aCompileOptions, std::move(stencil), unused, aRv, + aEncodeBytecode); } void JSExecutionContext::Compile(JS::CompileOptions& aCompileOptions, JS::SourceText& aSrcBuf, - ErrorResult& aRv) { - InternalCompile(aCompileOptions, aSrcBuf, aRv); + ErrorResult& aRv, + bool aEncodeBytecode /*= false */) { + InternalCompile(aCompileOptions, aSrcBuf, aEncodeBytecode, aRv); } void JSExecutionContext::Compile(JS::CompileOptions& aCompileOptions, JS::SourceText& aSrcBuf, - ErrorResult& aRv) { - InternalCompile(aCompileOptions, aSrcBuf, aRv); + ErrorResult& aRv, + bool aEncodeBytecode /*= false */) { + InternalCompile(aCompileOptions, aSrcBuf, aEncodeBytecode, aRv); } void JSExecutionContext::Compile(JS::CompileOptions& aCompileOptions, - const nsAString& aScript, ErrorResult& aRv) { + const nsAString& aScript, ErrorResult& aRv, + bool aEncodeBytecode /*= false */) { MOZ_ASSERT(!mSkip); const nsPromiseFlatString& flatScript = PromiseFlatString(aScript); @@ -186,7 +190,7 @@ void JSExecutionContext::Compile(JS::CompileOptions& aCompileOptions, return; } - Compile(aCompileOptions, srcBuf, aRv); + Compile(aCompileOptions, srcBuf, aRv, aEncodeBytecode); } void JSExecutionContext::Decode(JS::CompileOptions& aCompileOptions, @@ -227,7 +231,7 @@ void JSExecutionContext::Decode(JS::CompileOptions& aCompileOptions, void JSExecutionContext::InstantiateStencil( JS::CompileOptions& aCompileOptions, RefPtr&& aStencil, bool& incrementalEncodingAlreadyStarted, ErrorResult& aRv, - JS::InstantiationStorage* aStorage) { + bool aEncodeBytecode /* = false */, JS::InstantiationStorage* aStorage) { JS::InstantiateOptions instantiateOptions(aCompileOptions); JS::Rooted script( mCx, JS::InstantiateGlobalStencil(mCx, instantiateOptions, aStencil, @@ -238,7 +242,7 @@ void JSExecutionContext::InstantiateStencil( return; } - if (mEncodeBytecode) { + if (aEncodeBytecode) { if (!JS::StartIncrementalEncoding(mCx, std::move(aStencil), incrementalEncodingAlreadyStarted)) { mSkip = true; @@ -297,7 +301,8 @@ static bool IsPromiseValue(JSContext* aCx, JS::Handle aValue) { } void JSExecutionContext::ExecScript(JS::MutableHandle aRetValue, - ErrorResult& aRv) { + ErrorResult& aRv, + bool aCoerceToString /* = false */) { MOZ_ASSERT(!mSkip); MOZ_ASSERT(mScript); @@ -312,7 +317,7 @@ void JSExecutionContext::ExecScript(JS::MutableHandle aRetValue, #ifdef DEBUG mWantsReturnValue = false; #endif - if (mCoerceToString && IsPromiseValue(mCx, aRetValue)) { + if (aCoerceToString && IsPromiseValue(mCx, aRetValue)) { // We're a javascript: url and we should treat Promise return values as // undefined. // @@ -321,7 +326,7 @@ void JSExecutionContext::ExecScript(JS::MutableHandle aRetValue, aRetValue.setUndefined(); } - if (mCoerceToString && !aRetValue.isUndefined()) { + if (aCoerceToString && !aRetValue.isUndefined()) { JSString* str = JS::ToString(mCx, aRetValue); if (!str) { // ToString can be a function call, so an exception can be raised while diff --git a/dom/base/JSExecutionContext.h b/dom/base/JSExecutionContext.h index 387d46efa289..b14448ca2a80 100644 --- a/dom/base/JSExecutionContext.h +++ b/dom/base/JSExecutionContext.h @@ -63,12 +63,6 @@ class MOZ_STACK_CLASS JSExecutionContext final { // result is carried by mRv. bool mSkip; - // Should the result be serialized before being returned. - bool mCoerceToString; - - // Encode the bytecode before it is being executed. - bool mEncodeBytecode; - bool mKeepStencil = false; #ifdef DEBUG @@ -82,7 +76,8 @@ class MOZ_STACK_CLASS JSExecutionContext final { // Compile a script contained in a SourceText. template void InternalCompile(JS::CompileOptions& aCompileOptions, - JS::SourceText& aSrcBuf, ErrorResult& aRv); + JS::SourceText& aSrcBuf, bool aEncodeBytecode, + ErrorResult& aRv); public: // Enter compartment in which the code would be executed. The JSContext @@ -111,37 +106,24 @@ class MOZ_STACK_CLASS JSExecutionContext final { void SetKeepStencil() { mKeepStencil = true; } already_AddRefed StealStencil() { return mStencil.forget(); } - // The returned value would be converted to a string if the - // |aCoerceToString| is flag set. - JSExecutionContext& SetCoerceToString(bool aCoerceToString) { - mCoerceToString = aCoerceToString; - return *this; - } - - // When set, this flag records and encodes the bytecode as soon as it is - // being compiled, and before it is being executed. The bytecode can then be - // requested by using |JS::FinishIncrementalEncoding| with the mutable - // handle |aScript| argument of |CompileAndExec| or |JoinAndExec|. - JSExecutionContext& SetEncodeBytecode(bool aEncodeBytecode) { - mEncodeBytecode = aEncodeBytecode; - return *this; - } - // After getting a notification that an off-thread compile/decode finished, // this function will take the result of the off-thread operation and move it // to the main thread. void JoinOffThread(JS::CompileOptions& aCompileOptions, - ScriptLoadContext* aContext, ErrorResult& aRv); + ScriptLoadContext* aContext, ErrorResult& aRv, + bool aEncodeBytecode = false); // Compile a script contained in a SourceText. void Compile(JS::CompileOptions& aCompileOptions, - JS::SourceText& aSrcBuf, ErrorResult& aRv); + JS::SourceText& aSrcBuf, ErrorResult& aRv, + bool aEncodeBytecode = false); void Compile(JS::CompileOptions& aCompileOptions, - JS::SourceText& aSrcBuf, ErrorResult& aRv); + JS::SourceText& aSrcBuf, ErrorResult& aRv, + bool aEncodeBytecode = false); // Compile a script contained in a string. void Compile(JS::CompileOptions& aCompileOptions, const nsAString& aScript, - ErrorResult& aRv); + ErrorResult& aRv, bool aEncodeBytecode = false); // Decode a script contained in a buffer. void Decode(JS::CompileOptions& aCompileOptions, @@ -152,7 +134,7 @@ class MOZ_STACK_CLASS JSExecutionContext final { void InstantiateStencil(JS::CompileOptions& aCompileOptions, RefPtr&& aStencil, bool& incrementalEncodingAlreadyStarted, - ErrorResult& aRv, + ErrorResult& aRv, bool aEncodeBytecode = false, JS::InstantiationStorage* aStorage = nullptr); // Get a successfully compiled script. @@ -174,7 +156,11 @@ class MOZ_STACK_CLASS JSExecutionContext final { // compartment given as argument to the JSExecutionContext constructor. If the // caller is in a different compartment, then the out-param value should be // wrapped by calling |JS_WrapValue|. - void ExecScript(JS::MutableHandle aRetValue, ErrorResult& aRv); + // + // The returned value will be converted to a string if the + // |aCoerceToString| is flag set. + void ExecScript(JS::MutableHandle aRetValue, ErrorResult& aRv, + bool aCoerceToString = false); }; } // namespace dom } // namespace mozilla diff --git a/dom/jsurl/nsJSProtocolHandler.cpp b/dom/jsurl/nsJSProtocolHandler.cpp index 6c33f4c707ee..7fbecd64498a 100644 --- a/dom/jsurl/nsJSProtocolHandler.cpp +++ b/dom/jsurl/nsJSProtocolHandler.cpp @@ -329,10 +329,9 @@ nsresult nsJSThunk::EvaluateScript( mozilla::ErrorResult erv; JSExecutionContext exec(cx, globalJSObject, options, erv); if (!erv.Failed()) { - exec.SetCoerceToString(true); exec.Compile(options, NS_ConvertUTF8toUTF16(script), erv); if (!erv.Failed()) { - exec.ExecScript(&v, erv); + exec.ExecScript(&v, erv, /* aCoerceToString */ true); } } rv = mozilla::dom::EvaluationExceptionToNSResult(erv); diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp index 9c7684c38fb8..49fd97324739 100644 --- a/dom/script/ScriptLoader.cpp +++ b/dom/script/ScriptLoader.cpp @@ -2751,7 +2751,7 @@ void ScriptLoader::InstantiateClassicScriptFromMaybeEncodedSource( MOZ_ASSERT(aRequest->IsSource()); CalculateBytecodeCacheFlag(aRequest); - aExec.SetEncodeBytecode(aRequest->PassedConditionForBytecodeEncoding()); + bool encodeBytecode = aRequest->PassedConditionForBytecodeEncoding(); if (aRequest->GetScriptLoadContext()->mCompileOrDecodeTask) { // Off-main-thread parsing. @@ -2760,7 +2760,8 @@ void ScriptLoader::InstantiateClassicScriptFromMaybeEncodedSource( "Execute", aRequest)); MOZ_ASSERT(aRequest->IsTextSource()); - aExec.JoinOffThread(aCompileOptions, aRequest->GetScriptLoadContext(), aRv); + aExec.JoinOffThread(aCompileOptions, aRequest->GetScriptLoadContext(), aRv, + encodeBytecode); } else { // Main thread parsing (inline and small scripts) LOG(("ScriptLoadRequest (%p): Compile And Exec", aRequest)); @@ -2774,7 +2775,7 @@ void ScriptLoader::InstantiateClassicScriptFromMaybeEncodedSource( profilerLabelString); auto compile = [&](auto& source) { - aExec.Compile(aCompileOptions, source, aRv); + aExec.Compile(aCompileOptions, source, aRv, encodeBytecode); }; MOZ_ASSERT(!maybeSource.empty()); @@ -2795,11 +2796,10 @@ void ScriptLoader::InstantiateClassicScriptFromCachedStencil( return; } - aExec.SetEncodeBytecode(true); - bool incrementalEncodingAlreadyStarted = false; aExec.InstantiateStencil(aCompileOptions, std::move(stencil), - incrementalEncodingAlreadyStarted, aRv); + incrementalEncodingAlreadyStarted, aRv, + /* aEncodeBytecode */ true); if (incrementalEncodingAlreadyStarted) { aRequest->MarkSkippedBytecodeEncoding(); }