From c965fbdd103d3a4390ec20dbeb8c078540d2e8be Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Sun, 9 Apr 2023 09:49:27 -0500 Subject: [PATCH] Issue #1691 - Part 5: Don't pre-create module metadata object when compiling. https://bugzilla.mozilla.org/show_bug.cgi?id=1489477 (cherry picked from commit d83bad49f6b03894548fbf85fc18ad7e8cc19a93) --- js/src/frontend/FoldConstants.cpp | 1 - js/src/jit/BaselineCompiler.cpp | 18 ++++++++++++++---- js/src/jit/CodeGenerator.cpp | 12 ++++++++++++ js/src/jit/CodeGenerator.h | 1 + js/src/jit/IonBuilder.cpp | 11 ++++------- js/src/jit/Lowering.cpp | 8 ++++++++ js/src/jit/Lowering.h | 1 + js/src/jit/MIR.h | 27 +++++++++++++++++++++++++++ js/src/jit/MOpcodes.h | 1 + js/src/jit/shared/LIR-shared.h | 13 +++++++++++++ js/src/jit/shared/LOpcodes-shared.h | 1 + 11 files changed, 82 insertions(+), 12 deletions(-) diff --git a/js/src/frontend/FoldConstants.cpp b/js/src/frontend/FoldConstants.cpp index 8bd81faab4..35e4b86e0b 100644 --- a/js/src/frontend/FoldConstants.cpp +++ b/js/src/frontend/FoldConstants.cpp @@ -1914,7 +1914,6 @@ Fold(ExclusiveContext* cx, ParseNode** pnp, Parser& parser, bo case PNK_CALL_IMPORT: { BinaryNode* node = &pn->as(); - MOZ_ASSERT(pn->isArity(PN_BINARY)); MOZ_ASSERT(node->left()->isKind(PNK_POSHOLDER)); return Fold(cx, node->unsafeRightReference(), parser, inGenexpLambda); } diff --git a/js/src/jit/BaselineCompiler.cpp b/js/src/jit/BaselineCompiler.cpp index 521c252a16..74cfb82e43 100644 --- a/js/src/jit/BaselineCompiler.cpp +++ b/js/src/jit/BaselineCompiler.cpp @@ -4695,17 +4695,27 @@ BaselineCompiler::emit_JSOP_JUMPTARGET() return true; } +typedef JSObject* (*GetOrCreateModuleMetaObjectFn)(JSContext*, HandleObject); +static const VMFunction GetOrCreateModuleMetaObjectInfo = + FunctionInfo(js::GetOrCreateModuleMetaObject, + "GetOrCreateModuleMetaObject"); + bool BaselineCompiler::emit_JSOP_IMPORTMETA() { RootedModuleObject module(cx, GetModuleObjectForScript(script)); MOZ_ASSERT(module); - JSObject* metaObject = GetOrCreateModuleMetaObject(cx, module); - if (!metaObject) - return false; + frame.syncStack(0); - frame.push(ObjectValue(*metaObject)); + prepareVMCall(); + pushArg(ImmGCPtr(module)); + if (!callVM(GetOrCreateModuleMetaObjectInfo)) { + return false; + } + + masm.tagValue(JSVAL_TYPE_OBJECT, ReturnReg, R0); + frame.push(R0); return true; } diff --git a/js/src/jit/CodeGenerator.cpp b/js/src/jit/CodeGenerator.cpp index 9aa97be31c..1f7d292f29 100644 --- a/js/src/jit/CodeGenerator.cpp +++ b/js/src/jit/CodeGenerator.cpp @@ -2402,6 +2402,18 @@ CodeGenerator::visitNullarySharedStub(LNullarySharedStub* lir) } } +typedef JSObject* (*GetOrCreateModuleMetaObjectFn)(JSContext*, HandleObject); +static const VMFunction GetOrCreateModuleMetaObjectInfo = + FunctionInfo(js::GetOrCreateModuleMetaObject, + "GetOrCreateModuleMetaObject"); + +void +CodeGenerator::visitModuleMetadata(LModuleMetadata* lir) +{ + pushArg(ImmPtr(lir->mir()->module())); + callVM(GetOrCreateModuleMetaObjectInfo, lir); +} + typedef JSObject* (*StartDynamicModuleImportFn)(JSContext*, HandleValue, HandleValue); static const VMFunction StartDynamicModuleImportInfo = FunctionInfo(js::StartDynamicModuleImport, diff --git a/js/src/jit/CodeGenerator.h b/js/src/jit/CodeGenerator.h index 5e4ddd606d..2749a68b05 100644 --- a/js/src/jit/CodeGenerator.h +++ b/js/src/jit/CodeGenerator.h @@ -442,6 +442,7 @@ class CodeGenerator final : public CodeGeneratorSpecific void visitRandom(LRandom* ins); void visitSignExtend(LSignExtend* ins); + void visitModuleMetadata(LModuleMetadata* lir); void visitDynamicImport(LDynamicImport* lir); #ifdef DEBUG diff --git a/js/src/jit/IonBuilder.cpp b/js/src/jit/IonBuilder.cpp index 281dde6cf4..7721ed99d5 100644 --- a/js/src/jit/IonBuilder.cpp +++ b/js/src/jit/IonBuilder.cpp @@ -14259,13 +14259,10 @@ IonBuilder::jsop_importmeta() ModuleObject* module = GetModuleObjectForScript(script()); MOZ_ASSERT(module); - // The object must have been created already when we compiled for baseline. - JSObject* metaObject = module->metaObject(); - MOZ_ASSERT(metaObject); - - pushConstant(ObjectValue(*metaObject)); - - return true; + MModuleMetadata* meta = MModuleMetadata::New(alloc(), module); + current->add(meta); + current->push(meta); + return resumeAfter(meta); } bool diff --git a/js/src/jit/Lowering.cpp b/js/src/jit/Lowering.cpp index a68e2fac98..1c80c74716 100644 --- a/js/src/jit/Lowering.cpp +++ b/js/src/jit/Lowering.cpp @@ -2427,6 +2427,14 @@ LIRGenerator::visitNullarySharedStub(MNullarySharedStub* ins) assignSafepoint(lir, ins); } +void +LIRGenerator::visitModuleMetadata(MModuleMetadata* ins) +{ + LModuleMetadata* lir = new(alloc()) LModuleMetadata(); + defineReturn(lir, ins); + assignSafepoint(lir, ins); +} + void LIRGenerator::visitDynamicImport(MDynamicImport* ins) { diff --git a/js/src/jit/Lowering.h b/js/src/jit/Lowering.h index 393d8030e9..d0e00fb82f 100644 --- a/js/src/jit/Lowering.h +++ b/js/src/jit/Lowering.h @@ -334,6 +334,7 @@ class LIRGenerator : public LIRGeneratorSpecific void visitCheckIsCallable(MCheckIsCallable* ins); void visitCheckObjCoercible(MCheckObjCoercible* ins); void visitDebugCheckSelfHosted(MDebugCheckSelfHosted* ins); + void visitModuleMetadata(MModuleMetadata* ins); void visitDynamicImport(MDynamicImport* ins); }; diff --git a/js/src/jit/MIR.h b/js/src/jit/MIR.h index f6b26ee762..6c0616c71d 100644 --- a/js/src/jit/MIR.h +++ b/js/src/jit/MIR.h @@ -8379,6 +8379,33 @@ class MSubstr } }; +class MModuleMetadata : public MNullaryInstruction +{ + CompilerObject module_; + + explicit MModuleMetadata(JSObject* module) + : module_(module) + { + setResultType(MIRType::Object); + } + + public: + INSTRUCTION_HEADER(ModuleMetadata) + TRIVIAL_NEW_WRAPPERS + + JSObject* module() const { + return module_; + } + + AliasSet getAliasSet() const override { + return AliasSet::None(); + } + + bool appendRoots(MRootList& roots) const override { + return roots.append(module_); + } +}; + class MDynamicImport : public MBinaryInstruction, public BoxInputsPolicy::Data { diff --git a/js/src/jit/MOpcodes.h b/js/src/jit/MOpcodes.h index 8f411b04a0..54c65aff90 100644 --- a/js/src/jit/MOpcodes.h +++ b/js/src/jit/MOpcodes.h @@ -284,6 +284,7 @@ namespace jit { _(GlobalNameConflictsCheck) \ _(Debugger) \ _(NewTarget) \ + _(ModuleMetadata) \ _(DynamicImport) \ _(ArrowNewTarget) \ _(CheckReturn) \ diff --git a/js/src/jit/shared/LIR-shared.h b/js/src/jit/shared/LIR-shared.h index ffba2583d6..2d51a580bf 100644 --- a/js/src/jit/shared/LIR-shared.h +++ b/js/src/jit/shared/LIR-shared.h @@ -4939,6 +4939,19 @@ class LNullarySharedStub : public LCallInstructionHelper } }; +class LModuleMetadata : public LCallInstructionHelper<1, 0, 0> +{ + public: + LIR_HEADER(ModuleMetadata) + + const MModuleMetadata* mir() const { + return mir_->toModuleMetadata(); + } + + LModuleMetadata() + {} +}; + class LDynamicImport : public LCallInstructionHelper<1, 2 * BOX_PIECES, 0> { public: diff --git a/js/src/jit/shared/LOpcodes-shared.h b/js/src/jit/shared/LOpcodes-shared.h index 2c8799c6fe..396765fbd0 100644 --- a/js/src/jit/shared/LOpcodes-shared.h +++ b/js/src/jit/shared/LOpcodes-shared.h @@ -401,6 +401,7 @@ _(GlobalNameConflictsCheck) \ _(Debugger) \ _(NewTarget) \ + _(ModuleMetadata) \ _(DynamicImport) \ _(ArrowNewTarget) \ _(CheckReturn) \