diff --git a/dom/script/ModuleLoader.cpp b/dom/script/ModuleLoader.cpp index fb02a5900c3f..13054c4658b7 100644 --- a/dom/script/ModuleLoader.cpp +++ b/dom/script/ModuleLoader.cpp @@ -187,11 +187,10 @@ nsresult ModuleLoader::CompileOrFinishModuleScript( nsresult rv = aRequest->GetScriptSource(aCx, &maybeSource); NS_ENSURE_SUCCESS(rv, rv); - stencil = maybeSource.constructed>() - ? JS::CompileModuleScriptToStencil( - aCx, aOptions, maybeSource.ref>()) - : JS::CompileModuleScriptToStencil( - aCx, aOptions, maybeSource.ref>()); + auto compile = [&](auto& source) { + return JS::CompileModuleScriptToStencil(aCx, aOptions, source); + }; + stencil = maybeSource.mapNonEmpty(compile); } else { MOZ_ASSERT(aRequest->IsBytecode()); JS::DecodeOptions decodeOptions(aOptions); diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp index a1cc5ead1c17..97e8d8b5effa 100644 --- a/dom/script/ScriptLoader.cpp +++ b/dom/script/ScriptLoader.cpp @@ -1589,17 +1589,18 @@ nsresult ScriptLoader::AttemptAsyncScriptCompile(ScriptLoadRequest* aRequest, nsresult rv = aRequest->GetScriptSource(cx, &maybeSource); NS_ENSURE_SUCCESS(rv, rv); - aRequest->GetScriptLoadContext()->mOffThreadToken = - maybeSource.constructed>() - ? JS::CompileModuleToStencilOffThread( - cx, options, maybeSource.ref>(), - OffThreadScriptLoaderCallback, static_cast(runnable)) - : JS::CompileModuleToStencilOffThread( - cx, options, maybeSource.ref>(), - OffThreadScriptLoaderCallback, static_cast(runnable)); - if (!aRequest->GetScriptLoadContext()->mOffThreadToken) { + auto compile = [&](auto& source) { + return JS::CompileModuleToStencilOffThread( + cx, options, source, OffThreadScriptLoaderCallback, runnable.get()); + }; + + MOZ_ASSERT(!maybeSource.empty()); + JS::OffThreadToken* token = maybeSource.mapNonEmpty(compile); + if (!token) { return NS_ERROR_OUT_OF_MEMORY; } + + aRequest->GetScriptLoadContext()->mOffThreadToken = token; } else { MOZ_ASSERT(aRequest->IsTextSource()); @@ -1638,17 +1639,18 @@ nsresult ScriptLoader::AttemptAsyncScriptCompile(ScriptLoadRequest* aRequest, } } - aRequest->GetScriptLoadContext()->mOffThreadToken = - maybeSource.constructed>() - ? JS::CompileToStencilOffThread( - cx, options, maybeSource.ref>(), - OffThreadScriptLoaderCallback, static_cast(runnable)) - : JS::CompileToStencilOffThread( - cx, options, maybeSource.ref>(), - OffThreadScriptLoaderCallback, static_cast(runnable)); - if (!aRequest->GetScriptLoadContext()->mOffThreadToken) { + auto compile = [&](auto& source) { + return JS::CompileToStencilOffThread( + cx, options, source, OffThreadScriptLoaderCallback, runnable.get()); + }; + + MOZ_ASSERT(!maybeSource.empty()); + JS::OffThreadToken* token = maybeSource.mapNonEmpty(compile); + if (!token) { return NS_ERROR_OUT_OF_MEMORY; } + + aRequest->GetScriptLoadContext()->mOffThreadToken = token; } signalOOM.release(); @@ -2170,10 +2172,11 @@ nsresult ScriptLoader::CompileOrDecodeClassicScript( MarkerInnerWindowIdFromJSContext(aCx), profilerLabelString); + auto compile = [&](auto& source) { return aExec.Compile(source); }; + + MOZ_ASSERT(!maybeSource.empty()); TimeStamp startTime = TimeStamp::Now(); - rv = maybeSource.constructed>() - ? aExec.Compile(maybeSource.ref>()) - : aExec.Compile(maybeSource.ref>()); + rv = maybeSource.mapNonEmpty(compile); mMainThreadParseTime += TimeStamp::Now() - startTime; } } diff --git a/js/src/builtin/String.cpp b/js/src/builtin/String.cpp index 30728d7bf85d..d25a9104fbb4 100644 --- a/js/src/builtin/String.cpp +++ b/js/src/builtin/String.cpp @@ -1281,11 +1281,11 @@ static JSString* ToUpperCase(JSContext* cx, JSLinearString* str) { } } - return newChars.constructed() - ? newChars.ref().toStringDontDeflate(cx, - resultLength) - : newChars.ref().toStringDontDeflate(cx, - resultLength); + auto toString = [&](auto& chars) { + return chars.toStringDontDeflate(cx, resultLength); + }; + + return newChars.mapNonEmpty(toString); } JSString* js::StringToUpperCase(JSContext* cx, HandleString string) { diff --git a/mfbt/MaybeOneOf.h b/mfbt/MaybeOneOf.h index 65c137bb7d38..769f18d5ddbc 100644 --- a/mfbt/MaybeOneOf.h +++ b/mfbt/MaybeOneOf.h @@ -131,6 +131,23 @@ class MOZ_NON_PARAM MaybeOneOf { } } + template + constexpr auto mapNonEmpty(Func&& aFunc) const { + MOZ_ASSERT(!empty()); + if (state == SomeT1) { + return std::forward(aFunc)(as()); + } + return std::forward(aFunc)(as()); + } + template + constexpr auto mapNonEmpty(Func&& aFunc) { + MOZ_ASSERT(!empty()); + if (state == SomeT1) { + return std::forward(aFunc)(as()); + } + return std::forward(aFunc)(as()); + } + private: MaybeOneOf(const MaybeOneOf& aOther) = delete; const MaybeOneOf& operator=(const MaybeOneOf& aOther) = delete;