Bug 1724236 - Get CompileOptions from function arguments instead of member r=arai

Differential Revision: https://phabricator.services.mozilla.com/D218442
This commit is contained in:
Bryan Thrall
2024-10-30 13:41:40 +00:00
parent 190d6b921b
commit b6fd76662b
6 changed files with 70 additions and 52 deletions

View File

@@ -75,7 +75,6 @@ JSExecutionContext::JSExecutionContext(
mRealm(aCx, aGlobal), mRealm(aCx, aGlobal),
mRetValue(aCx), mRetValue(aCx),
mScript(aCx), mScript(aCx),
mCompileOptions(aCompileOptions),
mDebuggerPrivateValue(aCx, aDebuggerPrivateValue), mDebuggerPrivateValue(aCx, aDebuggerPrivateValue),
mDebuggerIntroductionScript(aCx, aDebuggerIntroductionScript), mDebuggerIntroductionScript(aCx, aDebuggerIntroductionScript),
mSkip(false), mSkip(false),
@@ -100,7 +99,8 @@ JSExecutionContext::JSExecutionContext(
} }
} }
void JSExecutionContext::JoinOffThread(ScriptLoadContext* aContext, void JSExecutionContext::JoinOffThread(JS::CompileOptions& aCompileOptions,
ScriptLoadContext* aContext,
ErrorResult& aRv) { ErrorResult& aRv) {
MOZ_ASSERT(!mSkip); MOZ_ASSERT(!mSkip);
@@ -124,22 +124,24 @@ void JSExecutionContext::JoinOffThread(ScriptLoadContext* aContext,
} }
bool unused; bool unused;
InstantiateStencil(std::move(stencil), unused, aRv, &storage); InstantiateStencil(aCompileOptions, std::move(stencil), unused, aRv,
&storage);
} }
template <typename Unit> template <typename Unit>
void JSExecutionContext::InternalCompile(JS::SourceText<Unit>& aSrcBuf, void JSExecutionContext::InternalCompile(JS::CompileOptions& aCompileOptions,
JS::SourceText<Unit>& aSrcBuf,
ErrorResult& aRv) { ErrorResult& aRv) {
MOZ_ASSERT(!mSkip); MOZ_ASSERT(!mSkip);
MOZ_ASSERT(aSrcBuf.get()); MOZ_ASSERT(aSrcBuf.get());
MOZ_ASSERT(mRetValue.isUndefined()); MOZ_ASSERT(mRetValue.isUndefined());
#ifdef DEBUG #ifdef DEBUG
mWantsReturnValue = !mCompileOptions.noScriptRval; mWantsReturnValue = !aCompileOptions.noScriptRval;
#endif #endif
RefPtr<JS::Stencil> stencil = RefPtr<JS::Stencil> stencil =
CompileGlobalScriptToStencil(mCx, mCompileOptions, aSrcBuf); CompileGlobalScriptToStencil(mCx, aCompileOptions, aSrcBuf);
if (!stencil) { if (!stencil) {
mSkip = true; mSkip = true;
aRv.NoteJSContextException(mCx); aRv.NoteJSContextException(mCx);
@@ -156,20 +158,23 @@ void JSExecutionContext::InternalCompile(JS::SourceText<Unit>& aSrcBuf,
} }
bool unused; bool unused;
InstantiateStencil(std::move(stencil), unused, aRv); InstantiateStencil(aCompileOptions, std::move(stencil), unused, aRv);
} }
void JSExecutionContext::Compile(JS::SourceText<char16_t>& aSrcBuf, void JSExecutionContext::Compile(JS::CompileOptions& aCompileOptions,
JS::SourceText<char16_t>& aSrcBuf,
ErrorResult& aRv) { ErrorResult& aRv) {
InternalCompile(aSrcBuf, aRv); InternalCompile(aCompileOptions, aSrcBuf, aRv);
} }
void JSExecutionContext::Compile(JS::SourceText<Utf8Unit>& aSrcBuf, void JSExecutionContext::Compile(JS::CompileOptions& aCompileOptions,
JS::SourceText<Utf8Unit>& aSrcBuf,
ErrorResult& aRv) { ErrorResult& aRv) {
InternalCompile(aSrcBuf, aRv); InternalCompile(aCompileOptions, aSrcBuf, aRv);
} }
void JSExecutionContext::Compile(const nsAString& aScript, ErrorResult& aRv) { void JSExecutionContext::Compile(JS::CompileOptions& aCompileOptions,
const nsAString& aScript, ErrorResult& aRv) {
MOZ_ASSERT(!mSkip); MOZ_ASSERT(!mSkip);
const nsPromiseFlatString& flatScript = PromiseFlatString(aScript); const nsPromiseFlatString& flatScript = PromiseFlatString(aScript);
@@ -181,14 +186,15 @@ void JSExecutionContext::Compile(const nsAString& aScript, ErrorResult& aRv) {
return; return;
} }
Compile(srcBuf, aRv); Compile(aCompileOptions, srcBuf, aRv);
} }
void JSExecutionContext::Decode(const JS::TranscodeRange& aBytecodeBuf, void JSExecutionContext::Decode(JS::CompileOptions& aCompileOptions,
const JS::TranscodeRange& aBytecodeBuf,
ErrorResult& aRv) { ErrorResult& aRv) {
MOZ_ASSERT(!mSkip); MOZ_ASSERT(!mSkip);
JS::DecodeOptions decodeOptions(mCompileOptions); JS::DecodeOptions decodeOptions(aCompileOptions);
decodeOptions.borrowBuffer = true; decodeOptions.borrowBuffer = true;
MOZ_ASSERT(!mWantsReturnValue); MOZ_ASSERT(!mWantsReturnValue);
@@ -215,13 +221,14 @@ void JSExecutionContext::Decode(const JS::TranscodeRange& aBytecodeBuf,
} }
bool unused; bool unused;
InstantiateStencil(std::move(stencil), unused, aRv); InstantiateStencil(aCompileOptions, std::move(stencil), unused, aRv);
} }
void JSExecutionContext::InstantiateStencil( void JSExecutionContext::InstantiateStencil(
RefPtr<JS::Stencil>&& aStencil, bool& incrementalEncodingAlreadyStarted, JS::CompileOptions& aCompileOptions, RefPtr<JS::Stencil>&& aStencil,
ErrorResult& aRv, JS::InstantiationStorage* aStorage) { bool& incrementalEncodingAlreadyStarted, ErrorResult& aRv,
JS::InstantiateOptions instantiateOptions(mCompileOptions); JS::InstantiationStorage* aStorage) {
JS::InstantiateOptions instantiateOptions(aCompileOptions);
JS::Rooted<JSScript*> script( JS::Rooted<JSScript*> script(
mCx, JS::InstantiateGlobalStencil(mCx, instantiateOptions, aStencil, mCx, JS::InstantiateGlobalStencil(mCx, instantiateOptions, aStencil,
aStorage)); aStorage));

View File

@@ -49,9 +49,6 @@ class MOZ_STACK_CLASS JSExecutionContext final {
// The compiled script. // The compiled script.
JS::Rooted<JSScript*> mScript; JS::Rooted<JSScript*> mScript;
// The compilation options applied throughout
JS::CompileOptions& mCompileOptions;
// Debug Metadata: Values managed for the benefit of the debugger when // Debug Metadata: Values managed for the benefit of the debugger when
// inspecting code. // inspecting code.
// //
@@ -84,7 +81,8 @@ class MOZ_STACK_CLASS JSExecutionContext final {
private: private:
// Compile a script contained in a SourceText. // Compile a script contained in a SourceText.
template <typename Unit> template <typename Unit>
void InternalCompile(JS::SourceText<Unit>& aSrcBuf, ErrorResult& aRv); void InternalCompile(JS::CompileOptions& aCompileOptions,
JS::SourceText<Unit>& aSrcBuf, ErrorResult& aRv);
public: public:
// Enter compartment in which the code would be executed. The JSContext // Enter compartment in which the code would be executed. The JSContext
@@ -132,21 +130,27 @@ class MOZ_STACK_CLASS JSExecutionContext final {
// After getting a notification that an off-thread compile/decode finished, // 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 // this function will take the result of the off-thread operation and move it
// to the main thread. // to the main thread.
void JoinOffThread(ScriptLoadContext* aContext, ErrorResult& aRv); void JoinOffThread(JS::CompileOptions& aCompileOptions,
ScriptLoadContext* aContext, ErrorResult& aRv);
// Compile a script contained in a SourceText. // Compile a script contained in a SourceText.
void Compile(JS::SourceText<char16_t>& aSrcBuf, ErrorResult& aRv); void Compile(JS::CompileOptions& aCompileOptions,
void Compile(JS::SourceText<mozilla::Utf8Unit>& aSrcBuf, ErrorResult& aRv); JS::SourceText<char16_t>& aSrcBuf, ErrorResult& aRv);
void Compile(JS::CompileOptions& aCompileOptions,
JS::SourceText<mozilla::Utf8Unit>& aSrcBuf, ErrorResult& aRv);
// Compile a script contained in a string. // Compile a script contained in a string.
void Compile(const nsAString& aScript, ErrorResult& aRv); void Compile(JS::CompileOptions& aCompileOptions, const nsAString& aScript,
ErrorResult& aRv);
// Decode a script contained in a buffer. // Decode a script contained in a buffer.
void Decode(const JS::TranscodeRange& aBytecodeBuf, ErrorResult& aRv); void Decode(JS::CompileOptions& aCompileOptions,
const JS::TranscodeRange& aBytecodeBuf, ErrorResult& aRv);
// Instantiate (on main-thread) a JS::Stencil generated by off-thread or // Instantiate (on main-thread) a JS::Stencil generated by off-thread or
// main-thread parsing or decoding. // main-thread parsing or decoding.
void InstantiateStencil(RefPtr<JS::Stencil>&& aStencil, void InstantiateStencil(JS::CompileOptions& aCompileOptions,
RefPtr<JS::Stencil>&& aStencil,
bool& incrementalEncodingAlreadyStarted, bool& incrementalEncodingAlreadyStarted,
ErrorResult& aRv, ErrorResult& aRv,
JS::InstantiationStorage* aStorage = nullptr); JS::InstantiationStorage* aStorage = nullptr);

View File

@@ -6095,7 +6095,7 @@ bool WindowScriptTimeoutHandler::Call(const char* aExecutionReason) {
IgnoredErrorResult erv; IgnoredErrorResult erv;
JSExecutionContext exec(aes.cx(), global, options, erv); JSExecutionContext exec(aes.cx(), global, options, erv);
if (!erv.Failed()) { if (!erv.Failed()) {
exec.Compile(mExpr, erv); exec.Compile(options, mExpr, erv);
JS::Rooted<JSScript*> script(aes.cx(), exec.MaybeGetScript()); JS::Rooted<JSScript*> script(aes.cx(), exec.MaybeGetScript());
if (script) { if (script) {

View File

@@ -330,7 +330,7 @@ nsresult nsJSThunk::EvaluateScript(
JSExecutionContext exec(cx, globalJSObject, options, erv); JSExecutionContext exec(cx, globalJSObject, options, erv);
if (!erv.Failed()) { if (!erv.Failed()) {
exec.SetCoerceToString(true); exec.SetCoerceToString(true);
exec.Compile(NS_ConvertUTF8toUTF16(script), erv); exec.Compile(options, NS_ConvertUTF8toUTF16(script), erv);
if (!erv.Failed()) { if (!erv.Failed()) {
exec.ExecScript(&v, erv); exec.ExecScript(&v, erv);
} }

View File

@@ -2722,7 +2722,8 @@ nsresult ScriptLoader::EvaluateScriptElement(ScriptLoadRequest* aRequest) {
} }
void ScriptLoader::InstantiateClassicScriptFromMaybeEncodedSource( void ScriptLoader::InstantiateClassicScriptFromMaybeEncodedSource(
JSContext* aCx, JSExecutionContext& aExec, ScriptLoadRequest* aRequest, JSContext* aCx, JSExecutionContext& aExec,
JS::CompileOptions& aCompileOptions, ScriptLoadRequest* aRequest,
ErrorResult& aRv) { ErrorResult& aRv) {
nsAutoCString profilerLabelString; nsAutoCString profilerLabelString;
aRequest->GetScriptLoadContext()->GetProfilerLabel(profilerLabelString); aRequest->GetScriptLoadContext()->GetProfilerLabel(profilerLabelString);
@@ -2731,14 +2732,15 @@ void ScriptLoader::InstantiateClassicScriptFromMaybeEncodedSource(
if (aRequest->GetScriptLoadContext()->mCompileOrDecodeTask) { if (aRequest->GetScriptLoadContext()->mCompileOrDecodeTask) {
LOG(("ScriptLoadRequest (%p): Decode Bytecode & instantiate and Execute", LOG(("ScriptLoadRequest (%p): Decode Bytecode & instantiate and Execute",
aRequest)); aRequest));
aExec.JoinOffThread(aRequest->GetScriptLoadContext(), aRv); aExec.JoinOffThread(aCompileOptions, aRequest->GetScriptLoadContext(),
aRv);
} else { } else {
LOG(("ScriptLoadRequest (%p): Decode Bytecode and Execute", aRequest)); LOG(("ScriptLoadRequest (%p): Decode Bytecode and Execute", aRequest));
AUTO_PROFILER_MARKER_TEXT("BytecodeDecodeMainThread", JS, AUTO_PROFILER_MARKER_TEXT("BytecodeDecodeMainThread", JS,
MarkerInnerWindowIdFromJSContext(aCx), MarkerInnerWindowIdFromJSContext(aCx),
profilerLabelString); profilerLabelString);
aExec.Decode(aRequest->Bytecode(), aRv); aExec.Decode(aCompileOptions, aRequest->Bytecode(), aRv);
} }
// We do not expect to be saving anything when we already have some // We do not expect to be saving anything when we already have some
@@ -2758,7 +2760,7 @@ void ScriptLoader::InstantiateClassicScriptFromMaybeEncodedSource(
"Execute", "Execute",
aRequest)); aRequest));
MOZ_ASSERT(aRequest->IsTextSource()); MOZ_ASSERT(aRequest->IsTextSource());
aExec.JoinOffThread(aRequest->GetScriptLoadContext(), aRv); aExec.JoinOffThread(aCompileOptions, aRequest->GetScriptLoadContext(), aRv);
} else { } else {
// Main thread parsing (inline and small scripts) // Main thread parsing (inline and small scripts)
LOG(("ScriptLoadRequest (%p): Compile And Exec", aRequest)); LOG(("ScriptLoadRequest (%p): Compile And Exec", aRequest));
@@ -2771,7 +2773,9 @@ void ScriptLoader::InstantiateClassicScriptFromMaybeEncodedSource(
MarkerInnerWindowIdFromJSContext(aCx), MarkerInnerWindowIdFromJSContext(aCx),
profilerLabelString); profilerLabelString);
auto compile = [&](auto& source) { aExec.Compile(source, aRv); }; auto compile = [&](auto& source) {
aExec.Compile(aCompileOptions, source, aRv);
};
MOZ_ASSERT(!maybeSource.empty()); MOZ_ASSERT(!maybeSource.empty());
TimeStamp startTime = TimeStamp::Now(); TimeStamp startTime = TimeStamp::Now();
@@ -2782,7 +2786,8 @@ void ScriptLoader::InstantiateClassicScriptFromMaybeEncodedSource(
} }
void ScriptLoader::InstantiateClassicScriptFromCachedStencil( void ScriptLoader::InstantiateClassicScriptFromCachedStencil(
JSContext* aCx, JSExecutionContext& aExec, ScriptLoadRequest* aRequest, JSContext* aCx, JSExecutionContext& aExec,
JS::CompileOptions& aCompileOptions, ScriptLoadRequest* aRequest,
JS::Stencil* aStencil, ErrorResult& aRv) { JS::Stencil* aStencil, ErrorResult& aRv) {
RefPtr<JS::Stencil> stencil = JS::DuplicateStencil(aCx, aStencil); RefPtr<JS::Stencil> stencil = JS::DuplicateStencil(aCx, aStencil);
if (!stencil) { if (!stencil) {
@@ -2793,21 +2798,21 @@ void ScriptLoader::InstantiateClassicScriptFromCachedStencil(
aExec.SetEncodeBytecode(true); aExec.SetEncodeBytecode(true);
bool incrementalEncodingAlreadyStarted = false; bool incrementalEncodingAlreadyStarted = false;
aExec.InstantiateStencil(std::move(stencil), aExec.InstantiateStencil(aCompileOptions, std::move(stencil),
incrementalEncodingAlreadyStarted, aRv); incrementalEncodingAlreadyStarted, aRv);
if (incrementalEncodingAlreadyStarted) { if (incrementalEncodingAlreadyStarted) {
aRequest->MarkSkippedBytecodeEncoding(); aRequest->MarkSkippedBytecodeEncoding();
} }
} }
void ScriptLoader::InstantiateClassicScriptFromAny(JSContext* aCx, void ScriptLoader::InstantiateClassicScriptFromAny(
JSExecutionContext& aExec, JSContext* aCx, JSExecutionContext& aExec,
ScriptLoadRequest* aRequest, JS::CompileOptions& aCompileOptions, ScriptLoadRequest* aRequest,
ErrorResult& aRv) { ErrorResult& aRv) {
if (aRequest->IsStencil()) { if (aRequest->IsStencil()) {
RefPtr<JS::Stencil> stencil = aRequest->GetStencil(); RefPtr<JS::Stencil> stencil = aRequest->GetStencil();
InstantiateClassicScriptFromCachedStencil(aCx, aExec, aRequest, stencil, InstantiateClassicScriptFromCachedStencil(aCx, aExec, aCompileOptions,
aRv); aRequest, stencil, aRv);
return; return;
} }
@@ -2828,7 +2833,8 @@ void ScriptLoader::InstantiateClassicScriptFromAny(JSContext* aCx,
} }
} }
InstantiateClassicScriptFromMaybeEncodedSource(aCx, aExec, aRequest, aRv); InstantiateClassicScriptFromMaybeEncodedSource(aCx, aExec, aCompileOptions,
aRequest, aRv);
if (!aRv.Failed()) { if (!aRv.Failed()) {
if (createCache) { if (createCache) {
MOZ_ASSERT(mCache); MOZ_ASSERT(mCache);
@@ -3003,7 +3009,7 @@ nsresult ScriptLoader::EvaluateScript(nsIGlobalObject* aGlobalObject,
if (erv.Failed()) { if (erv.Failed()) {
return EvaluationExceptionToNSResult(erv); return EvaluationExceptionToNSResult(erv);
} }
InstantiateClassicScriptFromAny(cx, exec, aRequest, erv); InstantiateClassicScriptFromAny(cx, exec, options, aRequest, erv);
if (!erv.Failed()) { if (!erv.Failed()) {
JS::Rooted<JSScript*> script(cx, exec.GetScript()); JS::Rooted<JSScript*> script(cx, exec.GetScript());

View File

@@ -640,6 +640,7 @@ class ScriptLoader final : public JS::loader::ScriptLoaderInterface {
// * cached stencil // * cached stencil
void InstantiateClassicScriptFromAny(JSContext* aCx, void InstantiateClassicScriptFromAny(JSContext* aCx,
JSExecutionContext& aExec, JSExecutionContext& aExec,
JS::CompileOptions& aCompileOptions,
ScriptLoadRequest* aRequest, ScriptLoadRequest* aRequest,
ErrorResult& aRv); ErrorResult& aRv);
@@ -647,16 +648,16 @@ class ScriptLoader final : public JS::loader::ScriptLoaderInterface {
// * text source // * text source
// * encoded bytecode // * encoded bytecode
void InstantiateClassicScriptFromMaybeEncodedSource( void InstantiateClassicScriptFromMaybeEncodedSource(
JSContext* aCx, JSExecutionContext& aExec, ScriptLoadRequest* aRequest, JSContext* aCx, JSExecutionContext& aExec,
JS::CompileOptions& aCompileOptions, ScriptLoadRequest* aRequest,
ErrorResult& aRv); ErrorResult& aRv);
// Instantiate classic script from the following data: // Instantiate classic script from the following data:
// * cached stencil // * cached stencil
void InstantiateClassicScriptFromCachedStencil(JSContext* aCx, void InstantiateClassicScriptFromCachedStencil(
JSExecutionContext& aExec, JSContext* aCx, JSExecutionContext& aExec,
ScriptLoadRequest* aRequest, JS::CompileOptions& aCompileOptions, ScriptLoadRequest* aRequest,
JS::Stencil* aStencil, JS::Stencil* aStencil, ErrorResult& aRv);
ErrorResult& aRv);
static nsCString& BytecodeMimeTypeFor(ScriptLoadRequest* aRequest); static nsCString& BytecodeMimeTypeFor(ScriptLoadRequest* aRequest);