mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-17 22:32:51 +00:00
Bug 1439361 - Simplify StartOffThreadParseTask and ParseTask initialization r=jandem
This commit is contained in:
parent
9df4d9d8b1
commit
88d6b191cb
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user