Bug 1674465 - Add CompileOptions::useStencilXDR. r=arai

No changes to behaviour. This splits the useOffThreadParseGlobal flag into
cases that care about the format and cases that care about the GC.

Depends on D95380

Differential Revision: https://phabricator.services.mozilla.com/D95381
This commit is contained in:
Ted Campbell 2020-10-31 04:52:15 +00:00
parent 85148b16e3
commit cbf947ada3
6 changed files with 22 additions and 13 deletions

View File

@ -133,6 +133,9 @@ class JS_PUBLIC_API TransitiveCompileOptions {
bool privateClassFields = false;
bool privateClassMethods = false;
// True if transcoding to XDR should use Stencil instead of JSScripts.
bool useStencilXDR = false;
// True if off-thread parsing should use a parse GlobalObject in order to
// directly allocate to the GC from a helper thread. If false, transfer the
// CompilationStencil back to main thread before allocating GC objects.

View File

@ -3461,6 +3461,7 @@ void JS::TransitiveCompileOptions::copyPODTransitiveOptions(
nonSyntacticScope = rhs.nonSyntacticScope;
privateClassFields = rhs.privateClassFields;
privateClassMethods = rhs.privateClassMethods;
useStencilXDR = rhs.useStencilXDR;
useOffThreadParseGlobal = rhs.useOffThreadParseGlobal;
};
@ -3555,6 +3556,8 @@ JS::CompileOptions::CompileOptions(JSContext* cx)
cx->options().throwOnAsmJSValidationFailure();
privateClassFields = cx->options().privateClassFields();
privateClassMethods = cx->options().privateClassMethods();
useStencilXDR = !UseOffThreadParseGlobal();
useOffThreadParseGlobal = UseOffThreadParseGlobal();
sourcePragmas_ = cx->options().sourcePragmas();
@ -5752,8 +5755,7 @@ JS_PUBLIC_API JS::TranscodeResult JS::DecodeScriptMaybeStencil(
JSContext* cx, const ReadOnlyCompileOptions& options,
TranscodeBuffer& buffer, JS::MutableHandleScript scriptp,
size_t cursorIndex) {
bool useStencilXDR = !options.useOffThreadParseGlobal;
if (!useStencilXDR) {
if (!options.useStencilXDR) {
// The buffer contains JSScript.
return JS::DecodeScript(cx, options, buffer, scriptp, cursorIndex);
}
@ -5802,8 +5804,7 @@ JS_PUBLIC_API JS::TranscodeResult JS::DecodeScriptAndStartIncrementalEncoding(
JSContext* cx, const ReadOnlyCompileOptions& options,
TranscodeBuffer& buffer, JS::MutableHandleScript scriptp,
size_t cursorIndex) {
bool useStencilXDR = !options.useOffThreadParseGlobal;
if (!useStencilXDR) {
if (!options.useStencilXDR) {
JS::TranscodeResult res =
JS::DecodeScript(cx, options, buffer, scriptp, cursorIndex);
if (res != JS::TranscodeResult_Ok) {

View File

@ -2440,10 +2440,10 @@ static bool Evaluate(JSContext* cx, unsigned argc, Value* vp) {
if (!FinishIncrementalEncoding(cx, script, saveBuffer)) {
return false;
}
if (js::UseOffThreadParseGlobal()) {
saveCacheKind = BytecodeCacheKind::Script;
} else {
if (options.useStencilXDR) {
saveCacheKind = BytecodeCacheKind::Stencil;
} else {
saveCacheKind = BytecodeCacheKind::Script;
}
}
}
@ -5917,6 +5917,8 @@ static bool OffThreadDecodeScript(JSContext* cx, unsigned argc, Value* vp) {
// for saveBytecode, or stencil for saveIncrementalBytecode.
options.useOffThreadParseGlobal =
CacheEntry_getKind(cx, cacheEntry) == BytecodeCacheKind::Script;
options.useStencilXDR =
CacheEntry_getKind(cx, cacheEntry) == BytecodeCacheKind::Stencil;
if (args.length() >= 2) {
if (args[1].isPrimitive()) {

View File

@ -112,8 +112,7 @@ static JSScript* CompileSourceBufferAndStartIncrementalEncoding(
return nullptr;
}
bool useStencilXDR = !options.useOffThreadParseGlobal;
if (useStencilXDR) {
if (options.useStencilXDR) {
UniquePtr<XDRIncrementalEncoderBase> xdrEncoder;
if (!compilationInfo.get().input.source()->xdrEncodeInitialStencil(

View File

@ -778,8 +778,7 @@ void ScriptDecodeTask::parse(JSContext* cx) {
RootedScript resultScript(cx);
Rooted<ScriptSourceObject*> sourceObject(cx);
bool useStencilXDR = !options.useOffThreadParseGlobal;
if (useStencilXDR) {
if (options.useStencilXDR) {
// The buffer contains stencil.
Rooted<UniquePtr<frontend::CompilationInfoVector>> compilationInfos(
cx, js_new<frontend::CompilationInfoVector>(cx, options));
@ -1218,6 +1217,9 @@ bool js::StartOffThreadDecodeScript(JSContext* cx,
return false;
}
// XDR data must be Stencil format, or a parse-global must be available.
MOZ_RELEASE_ASSERT(options.useStencilXDR || options.useOffThreadParseGlobal);
return StartOffThreadParseTask(cx, std::move(task), options);
}
@ -1237,6 +1239,7 @@ bool js::StartOffThreadDecodeMultiScripts(JSContext* cx,
// they must continue to use the off-thread-parse-global in order to
// decode.
CompileOptions optionsCopy(cx, options);
optionsCopy.useStencilXDR = false;
optionsCopy.useOffThreadParseGlobal = true;
return StartOffThreadParseTask(cx, std::move(task), optionsCopy);
@ -2114,8 +2117,7 @@ JSScript* GlobalHelperThreadState::finishSingleParseTask(
// Start the incremental-XDR encoder.
if (startEncoding == StartEncoding::Yes) {
bool useStencilXDR = !parseTask->options.useOffThreadParseGlobal;
if (useStencilXDR) {
if (parseTask->options.useStencilXDR) {
UniquePtr<XDRIncrementalEncoderBase> xdrEncoder;
if (parseTask->compilationInfo_.get()) {

View File

@ -1609,6 +1609,8 @@ bool DelazifyCanonicalScriptedFunctionImpl(JSContext* cx, HandleFunction fun,
}
if (ss->hasEncoder()) {
// NOTE: Currently we rely on the UseOffThreadParseGlobal to decide which
// format to use for incremental encoding.
bool useStencilXDR = !js::UseOffThreadParseGlobal();
if (useStencilXDR) {
if (!ss->xdrEncodeFunctionStencil(cx, compilationInfo.get().stencil)) {