From be99ae99cbc3fc5d14b3f89b4c80852d2618567c Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Tue, 17 Jul 2018 14:30:23 +0100 Subject: [PATCH] Bug 1475228 - Refactor ScriptLoader::GetScriptSource() to remove inline data argument r=baku --- dom/script/ScriptLoader.cpp | 31 ++++++++++++++----------------- dom/script/ScriptLoader.h | 4 ++-- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp index 2c4ea44d61b0..5952258cd7fe 100644 --- a/dom/script/ScriptLoader.cpp +++ b/dom/script/ScriptLoader.cpp @@ -491,8 +491,7 @@ ScriptLoader::CreateModuleScript(ModuleLoadRequest* aRequest) rv = FillCompileOptionsForRequest(aes, aRequest, global, &options); if (NS_SUCCEEDED(rv)) { - nsAutoString inlineData; - SourceBufferHolder srcBuf = GetScriptSource(aRequest, inlineData); + SourceBufferHolder srcBuf = GetScriptSource(cx, aRequest); rv = nsJSUtils::CompileModule(cx, srcBuf, global, options, &module); } } @@ -1830,9 +1829,7 @@ ScriptLoader::AttemptAsyncScriptCompile(ScriptLoadRequest* aRequest) if (aRequest->IsModuleRequest()) { MOZ_ASSERT(aRequest->IsTextSource()); - JS::SourceBufferHolder srcBuf(aRequest->ScriptText().begin(), - aRequest->ScriptText().length(), - JS::SourceBufferHolder::NoOwnership); + JS::SourceBufferHolder srcBuf = GetScriptSource(cx, aRequest); if (!JS::CompileOffThreadModule(cx, options, srcBuf, OffThreadScriptLoaderCallback, @@ -1860,9 +1857,7 @@ ScriptLoader::AttemptAsyncScriptCompile(ScriptLoadRequest* aRequest) #endif } else { MOZ_ASSERT(aRequest->IsTextSource()); - JS::SourceBufferHolder srcBuf(aRequest->ScriptText().begin(), - aRequest->ScriptText().length(), - JS::SourceBufferHolder::NoOwnership); + JS::SourceBufferHolder srcBuf = GetScriptSource(cx, aRequest); if (!JS::CompileOffThread(cx, options, srcBuf, OffThreadScriptLoaderCallback, @@ -1900,19 +1895,22 @@ ScriptLoader::CompileOffThreadOrProcessRequest(ScriptLoadRequest* aRequest) } SourceBufferHolder -ScriptLoader::GetScriptSource(ScriptLoadRequest* aRequest, nsAutoString& inlineData) +ScriptLoader::GetScriptSource(JSContext* aCx, ScriptLoadRequest* aRequest) { // Return a SourceBufferHolder object holding the script's source text. - // |inlineData| is used to hold the text for inline objects. // If there's no script text, we try to get it from the element if (aRequest->mIsInline) { - // XXX This is inefficient - GetText makes multiple - // copies. + nsAutoString inlineData; aRequest->mElement->GetScriptText(inlineData); - return SourceBufferHolder(inlineData.get(), - inlineData.Length(), - SourceBufferHolder::NoOwnership); + + // Copy string to JS allocated buffer and transfer ownership to + // SourceBufferHolder result. + size_t nbytes = inlineData.Length() * sizeof(char16_t); + JS::UniqueTwoByteChars chars(static_cast(JS_malloc(aCx, nbytes))); + MOZ_RELEASE_ASSERT(chars); + memcpy(chars.get(), inlineData.get(), nbytes); + return SourceBufferHolder(std::move(chars), inlineData.Length()); } return SourceBufferHolder(aRequest->ScriptText().begin(), @@ -2362,8 +2360,7 @@ ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest) &script); } else { MOZ_ASSERT(aRequest->IsTextSource()); - nsAutoString inlineData; - SourceBufferHolder srcBuf = GetScriptSource(aRequest, inlineData); + SourceBufferHolder srcBuf = GetScriptSource(cx, aRequest); if (recordreplay::IsRecordingOrReplaying()) { recordreplay::NoteContentParse(this, options.filename(), "application/javascript", diff --git a/dom/script/ScriptLoader.h b/dom/script/ScriptLoader.h index 82d6c5120e2f..6f9ff1d6cd30 100644 --- a/dom/script/ScriptLoader.h +++ b/dom/script/ScriptLoader.h @@ -504,8 +504,8 @@ private: void MaybeMoveToLoadedList(ScriptLoadRequest* aRequest); - JS::SourceBufferHolder GetScriptSource(ScriptLoadRequest* aRequest, - nsAutoString& inlineData); + JS::SourceBufferHolder GetScriptSource(JSContext* aCx, + ScriptLoadRequest* aRequest); void SetModuleFetchStarted(ModuleLoadRequest *aRequest); void SetModuleFetchFinishedAndResumeWaitingRequests(ModuleLoadRequest* aRequest,