Bug 1475228 - Allocate script loader source buffers on the JS heap and pass ownership when compiling r=baku

This commit is contained in:
Jon Coppeard 2018-07-17 14:30:24 +01:00
Родитель 5ae8832ca2
Коммит d9eed341b0
3 изменённых файлов: 23 добавлений и 16 удалений

Просмотреть файл

@ -166,7 +166,7 @@ ScriptLoadRequest::SetTextSource()
{
MOZ_ASSERT(IsUnknownDataType());
mDataType = DataType::eTextSource;
mScriptData.emplace(VariantType<Vector<char16_t>>());
mScriptData.emplace(VariantType<ScriptTextBuffer>());
}
void
@ -175,7 +175,7 @@ ScriptLoadRequest::SetBinASTSource()
#ifdef JS_BUILD_BINAST
MOZ_ASSERT(IsUnknownDataType());
mDataType = DataType::eBinASTSource;
mScriptData.emplace(VariantType<Vector<uint8_t>>());
mScriptData.emplace(VariantType<BinASTSourceBuffer>());
#else
MOZ_CRASH("BinAST not supported");
#endif

Просмотреть файл

@ -171,21 +171,28 @@ public:
void SetBinASTSource();
void SetBytecode();
const Vector<char16_t>& ScriptText() const {
using ScriptTextBuffer = Vector<char16_t, 0, JSMallocAllocPolicy>;
using BinASTSourceBuffer = Vector<uint8_t>;
const ScriptTextBuffer& ScriptText() const
{
MOZ_ASSERT(IsTextSource());
return mScriptData->as<Vector<char16_t>>();
return mScriptData->as<ScriptTextBuffer>();
}
Vector<char16_t>& ScriptText() {
ScriptTextBuffer& ScriptText()
{
MOZ_ASSERT(IsTextSource());
return mScriptData->as<Vector<char16_t>>();
return mScriptData->as<ScriptTextBuffer>();
}
const Vector<uint8_t>& ScriptBinASTData() const {
const BinASTSourceBuffer& ScriptBinASTData() const
{
MOZ_ASSERT(IsBinASTSource());
return mScriptData->as<Vector<uint8_t>>();
return mScriptData->as<BinASTSourceBuffer>();
}
Vector<uint8_t>& ScriptBinASTData() {
BinASTSourceBuffer& ScriptBinASTData()
{
MOZ_ASSERT(IsBinASTSource());
return mScriptData->as<Vector<uint8_t>>();
return mScriptData->as<BinASTSourceBuffer>();
}
enum class ScriptMode : uint8_t {
@ -252,7 +259,7 @@ public:
// Holds script source data for non-inline scripts. Don't use nsString so we
// can give ownership to jsapi. Holds either char16_t source text characters
// or BinAST encoded bytes depending on mSourceEncoding.
Maybe<Variant<Vector<char16_t>, Vector<uint8_t>>> mScriptData;
Maybe<Variant<ScriptTextBuffer, BinASTSourceBuffer>> mScriptData;
// Holds the SRI serialized hash and the script bytecode for non-inline
// scripts.

Просмотреть файл

@ -1899,14 +1899,13 @@ SourceBufferHolder
ScriptLoader::GetScriptSource(JSContext* aCx, ScriptLoadRequest* aRequest)
{
// Return a SourceBufferHolder object holding the script's source text.
// Ownership of the buffer is transferred to the resulting SourceBufferHolder.
// If there's no script text, we try to get it from the element
if (aRequest->mIsInline) {
nsAutoString inlineData;
aRequest->mElement->GetScriptText(inlineData);
// 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<char16_t*>(JS_malloc(aCx, nbytes)));
MOZ_RELEASE_ASSERT(chars);
@ -1914,9 +1913,10 @@ ScriptLoader::GetScriptSource(JSContext* aCx, ScriptLoadRequest* aRequest)
return SourceBufferHolder(std::move(chars), inlineData.Length());
}
return SourceBufferHolder(aRequest->ScriptText().begin(),
aRequest->ScriptText().length(),
SourceBufferHolder::NoOwnership);
size_t length = aRequest->ScriptText().length();
return SourceBufferHolder(aRequest->ScriptText().extractOrCopyRawBuffer(),
length,
SourceBufferHolder::GiveOwnership);
}
nsresult