Bug 1439361 - Simplify StartOffThreadParseTask and ParseTask initialization r=jandem

This commit is contained in:
Jon Coppeard 2018-02-20 10:40:54 +00:00
parent 9df4d9d8b1
commit 88d6b191cb
2 changed files with 60 additions and 74 deletions

View File

@ -389,12 +389,11 @@ static const JSClass parseTaskGlobalClass = {
&parseTaskGlobalClassOps
};
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
const char16_t* chars, size_t length,
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData)
: kind(kind), options(cx), data(AsVariant(TwoByteChars(chars, length))),
alloc(JSContext::TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE),
parseGlobal(parseGlobal),
parseGlobal(nullptr),
callback(callback), callbackData(callbackData),
scripts(cx), sourceObjects(cx),
overRecursed(false), outOfMemory(false)
@ -403,12 +402,11 @@ ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
MOZ_ALWAYS_TRUE(sourceObjects.reserve(sourceObjects.capacity()));
}
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
const JS::TranscodeRange& range,
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, const JS::TranscodeRange& range,
JS::OffThreadCompileCallback callback, void* callbackData)
: kind(kind), options(cx), data(AsVariant(range)),
alloc(JSContext::TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE),
parseGlobal(parseGlobal),
parseGlobal(nullptr),
callback(callback), callbackData(callbackData),
scripts(cx), sourceObjects(cx),
overRecursed(false), outOfMemory(false)
@ -417,12 +415,11 @@ ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
MOZ_ALWAYS_TRUE(sourceObjects.reserve(sourceObjects.capacity()));
}
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
JS::TranscodeSources& sources,
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JS::TranscodeSources& sources,
JS::OffThreadCompileCallback callback, void* callbackData)
: kind(kind), options(cx), data(AsVariant(&sources)),
alloc(JSContext::TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE),
parseGlobal(parseGlobal),
parseGlobal(nullptr),
callback(callback), callbackData(callbackData),
scripts(cx), sourceObjects(cx),
overRecursed(false), outOfMemory(false)
@ -432,11 +429,12 @@ ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
}
bool
ParseTask::init(JSContext* cx, const ReadOnlyCompileOptions& options)
ParseTask::init(JSContext* cx, const ReadOnlyCompileOptions& options, JSObject* global)
{
if (!this->options.copy(cx, options))
return false;
parseGlobal = global;
return true;
}
@ -483,13 +481,10 @@ ParseTask::trace(JSTracer* trc)
sourceObjects.trace(trc);
}
ScriptParseTask::ScriptParseTask(JSContext* cx, JSObject* parseGlobal,
const char16_t* chars, size_t length,
ScriptParseTask::ScriptParseTask(JSContext* cx, const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData)
: ParseTask(ParseTaskKind::Script, cx, parseGlobal, chars, length, callback,
callbackData)
{
}
: ParseTask(ParseTaskKind::Script, cx, chars, length, callback, callbackData)
{}
void
ScriptParseTask::parse(JSContext* cx)
@ -509,13 +504,10 @@ ScriptParseTask::parse(JSContext* cx)
sourceObjects.infallibleAppend(sourceObject);
}
ModuleParseTask::ModuleParseTask(JSContext* cx, JSObject* parseGlobal,
const char16_t* chars, size_t length,
ModuleParseTask::ModuleParseTask(JSContext* cx, const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData)
: ParseTask(ParseTaskKind::Module, cx, parseGlobal, chars, length, callback,
callbackData)
{
}
: ParseTask(ParseTaskKind::Module, cx, chars, length, callback, callbackData)
{}
void
ModuleParseTask::parse(JSContext* cx)
@ -532,13 +524,10 @@ ModuleParseTask::parse(JSContext* cx)
}
}
ScriptDecodeTask::ScriptDecodeTask(JSContext* cx, JSObject* parseGlobal,
const JS::TranscodeRange& range,
ScriptDecodeTask::ScriptDecodeTask(JSContext* cx, const JS::TranscodeRange& range,
JS::OffThreadCompileCallback callback, void* callbackData)
: ParseTask(ParseTaskKind::ScriptDecode, cx, parseGlobal,
range, callback, callbackData)
{
}
: ParseTask(ParseTaskKind::ScriptDecode, cx, range, callback, callbackData)
{}
void
ScriptDecodeTask::parse(JSContext* cx)
@ -557,13 +546,10 @@ ScriptDecodeTask::parse(JSContext* cx)
}
}
MultiScriptsDecodeTask::MultiScriptsDecodeTask(JSContext* cx, JSObject* parseGlobal,
JS::TranscodeSources& sources,
MultiScriptsDecodeTask::MultiScriptsDecodeTask(JSContext* cx, JS::TranscodeSources& sources,
JS::OffThreadCompileCallback callback, void* callbackData)
: ParseTask(ParseTaskKind::MultiScriptsDecode, cx, parseGlobal,
sources, callback, callbackData)
{
}
: ParseTask(ParseTaskKind::MultiScriptsDecode, cx, sources, callback, callbackData)
{}
void
MultiScriptsDecodeTask::parse(JSContext* cx)
@ -780,10 +766,8 @@ QueueOffThreadParseTask(JSContext* cx, ParseTask* task)
return true;
}
template <typename TaskFunctor>
bool
StartOffThreadParseTask(JSContext* cx, const ReadOnlyCompileOptions& options,
ParseTaskKind kind, TaskFunctor& taskFunctor)
StartOffThreadParseTask(JSContext* cx, ParseTask* task, const ReadOnlyCompileOptions& options)
{
// Suppress GC so that calls below do not trigger a new incremental GC
// which could require barriers on the atoms compartment.
@ -791,7 +775,7 @@ StartOffThreadParseTask(JSContext* cx, const ReadOnlyCompileOptions& options,
gc::AutoSuppressNurseryCellAlloc noNurseryAlloc(cx);
AutoSuppressAllocationMetadataBuilder suppressMetadata(cx);
JSObject* global = CreateGlobalForOffThreadParse(cx, kind, nogc);
JSObject* global = CreateGlobalForOffThreadParse(cx, task->kind, nogc);
if (!global)
return false;
@ -801,14 +785,12 @@ StartOffThreadParseTask(JSContext* cx, const ReadOnlyCompileOptions& options,
// this state is cleared automatically.
AutoSetCreatedForHelperThread createdForHelper(global);
ScopedJSDeletePtr<ParseTask> task(taskFunctor(global));
if (!task || !task->init(cx, options))
if (!task->init(cx, options, global))
return false;
if (!QueueOffThreadParseTask(cx, task))
return false;
task.forget();
createdForHelper.forget();
return true;
}
@ -818,11 +800,13 @@ js::StartOffThreadParseScript(JSContext* cx, const ReadOnlyCompileOptions& optio
const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData)
{
auto functor = [&](JSObject* global) -> ScriptParseTask* {
return cx->new_<ScriptParseTask>(cx, global, chars, length,
callback, callbackData);
};
return StartOffThreadParseTask(cx, options, ParseTaskKind::Script, functor);
ScopedJSDeletePtr<ParseTask> task;
task = cx->new_<ScriptParseTask>(cx, chars, length, callback, callbackData);
if (!task || !StartOffThreadParseTask(cx, task, options))
return false;
task.forget();
return true;
}
bool
@ -830,11 +814,13 @@ js::StartOffThreadParseModule(JSContext* cx, const ReadOnlyCompileOptions& optio
const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData)
{
auto functor = [&](JSObject* global) -> ModuleParseTask* {
return cx->new_<ModuleParseTask>(cx, global, chars, length,
callback, callbackData);
};
return StartOffThreadParseTask(cx, options, ParseTaskKind::Module, functor);
ScopedJSDeletePtr<ParseTask> task;
task = cx->new_<ModuleParseTask>(cx, chars, length, callback, callbackData);
if (!task || !StartOffThreadParseTask(cx, task, options))
return false;
task.forget();
return true;
}
bool
@ -842,10 +828,13 @@ js::StartOffThreadDecodeScript(JSContext* cx, const ReadOnlyCompileOptions& opti
const JS::TranscodeRange& range,
JS::OffThreadCompileCallback callback, void* callbackData)
{
auto functor = [&](JSObject* global) -> ScriptDecodeTask* {
return cx->new_<ScriptDecodeTask>(cx, global, range, callback, callbackData);
};
return StartOffThreadParseTask(cx, options, ParseTaskKind::ScriptDecode, functor);
ScopedJSDeletePtr<ParseTask> task;
task = cx->new_<ScriptDecodeTask>(cx, range, callback, callbackData);
if (!task || !StartOffThreadParseTask(cx, task, options))
return false;
task.forget();
return true;
}
bool
@ -853,10 +842,13 @@ js::StartOffThreadDecodeMultiScripts(JSContext* cx, const ReadOnlyCompileOptions
JS::TranscodeSources& sources,
JS::OffThreadCompileCallback callback, void* callbackData)
{
auto functor = [&](JSObject* global) -> MultiScriptsDecodeTask* {
return cx->new_<MultiScriptsDecodeTask>(cx, global, sources, callback, callbackData);
};
return StartOffThreadParseTask(cx, options, ParseTaskKind::MultiScriptsDecode, functor);
ScopedJSDeletePtr<ParseTask> task;
task = cx->new_<MultiScriptsDecodeTask>(cx, sources, callback, callbackData);
if (!task || !StartOffThreadParseTask(cx, task, options))
return false;
task.forget();
return true;
}
void

View File

@ -657,16 +657,14 @@ struct ParseTask
bool overRecursed;
bool outOfMemory;
ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
const char16_t* chars, size_t length,
ParseTask(ParseTaskKind kind, JSContext* cx, const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData);
ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
const JS::TranscodeRange& range,
ParseTask(ParseTaskKind kind, JSContext* cx, const JS::TranscodeRange& range,
JS::OffThreadCompileCallback callback, void* callbackData);
ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
JS::TranscodeSources& sources,
ParseTask(ParseTaskKind kind, JSContext* cx, JS::TranscodeSources& sources,
JS::OffThreadCompileCallback callback, void* callbackData);
bool init(JSContext* cx, const ReadOnlyCompileOptions& options);
bool init(JSContext* cx, const ReadOnlyCompileOptions& options, JSObject* global);
void activate(JSRuntime* rt);
virtual void parse(JSContext* cx) = 0;
@ -683,32 +681,28 @@ struct ParseTask
struct ScriptParseTask : public ParseTask
{
ScriptParseTask(JSContext* cx, JSObject* parseGlobal,
const char16_t* chars, size_t length,
ScriptParseTask(JSContext* cx, const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData);
void parse(JSContext* cx) override;
};
struct ModuleParseTask : public ParseTask
{
ModuleParseTask(JSContext* cx, JSObject* parseGlobal,
const char16_t* chars, size_t length,
ModuleParseTask(JSContext* cx, const char16_t* chars, size_t length,
JS::OffThreadCompileCallback callback, void* callbackData);
void parse(JSContext* cx) override;
};
struct ScriptDecodeTask : public ParseTask
{
ScriptDecodeTask(JSContext* cx, JSObject* parseGlobal,
const JS::TranscodeRange& range,
ScriptDecodeTask(JSContext* cx, const JS::TranscodeRange& range,
JS::OffThreadCompileCallback callback, void* callbackData);
void parse(JSContext* cx) override;
};
struct MultiScriptsDecodeTask : public ParseTask
{
MultiScriptsDecodeTask(JSContext* cx, JSObject* parseGlobal,
JS::TranscodeSources& sources,
MultiScriptsDecodeTask(JSContext* cx, JS::TranscodeSources& sources,
JS::OffThreadCompileCallback callback, void* callbackData);
void parse(JSContext* cx) override;
};