mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-22 01:35:35 +00:00
Bug 1219288 - Add GETIMPORT instruction for accessing module imports that are not namespace imports r=shu
This commit is contained in:
parent
a87d1cf054
commit
611c616571
@ -1581,6 +1581,25 @@ BytecodeEmitter::tryConvertFreeName(ParseNode* pn)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (ssi.type() == StaticScopeIter<NoGC>::Module) {
|
||||||
|
RootedScript moduleScript(cx, ssi.moduleScript());
|
||||||
|
uint32_t slot_;
|
||||||
|
if (lookupAliasedName(moduleScript, name, &slot_, pn)) {
|
||||||
|
slot = Some(slot_);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert module import accesses to use JSOP_GETIMPORT.
|
||||||
|
RootedModuleEnvironmentObject env(cx, ssi.module().environment());
|
||||||
|
RootedPropertyName propName(cx, name);
|
||||||
|
MOZ_ASSERT(env);
|
||||||
|
if (env->hasImportBinding(propName)) {
|
||||||
|
if (pn->getOp() == JSOP_GETNAME) {
|
||||||
|
pn->setOp(JSOP_GETIMPORT);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else if (ssi.type() == StaticScopeIter<NoGC>::Block) {
|
} else if (ssi.type() == StaticScopeIter<NoGC>::Block) {
|
||||||
RootedShape shape(cx, ssi.block().lookupAliasedName(name));
|
RootedShape shape(cx, ssi.block().lookupAliasedName(name));
|
||||||
if (shape) {
|
if (shape) {
|
||||||
@ -1856,7 +1875,11 @@ BytecodeEmitter::bindNameToSlotHelper(ParseNode* pn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case Definition::PLACEHOLDER:
|
case Definition::PLACEHOLDER:
|
||||||
|
return true;
|
||||||
|
|
||||||
case Definition::IMPORT:
|
case Definition::IMPORT:
|
||||||
|
if (op == JSOP_GETNAME)
|
||||||
|
pn->setOp(JSOP_GETIMPORT);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case Definition::MISSING:
|
case Definition::MISSING:
|
||||||
|
11
js/src/jit-test/tests/modules/import-in-lazy-function.js
Normal file
11
js/src/jit-test/tests/modules/import-in-lazy-function.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// |jit-test| module
|
||||||
|
|
||||||
|
// Test that accessing imports in lazily parsed functions works.
|
||||||
|
|
||||||
|
import { a } from "module1.js";
|
||||||
|
|
||||||
|
function add1(x) {
|
||||||
|
return x + a;
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEq(add1(2), 3);
|
@ -204,9 +204,23 @@ GetNameOperation(JSContext* cx, InterpreterFrame* fp, jsbytecode* pc, MutableHan
|
|||||||
JSOp op2 = JSOp(pc[JSOP_GETNAME_LENGTH]);
|
JSOp op2 = JSOp(pc[JSOP_GETNAME_LENGTH]);
|
||||||
if (op2 == JSOP_TYPEOF)
|
if (op2 == JSOP_TYPEOF)
|
||||||
return FetchName<true>(cx, scopeRoot, pobjRoot, nameRoot, shapeRoot, vp);
|
return FetchName<true>(cx, scopeRoot, pobjRoot, nameRoot, shapeRoot, vp);
|
||||||
|
|
||||||
return FetchName<false>(cx, scopeRoot, pobjRoot, nameRoot, shapeRoot, vp);
|
return FetchName<false>(cx, scopeRoot, pobjRoot, nameRoot, shapeRoot, vp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
GetImportOperation(JSContext* cx, InterpreterFrame* fp, jsbytecode* pc, MutableHandleValue vp)
|
||||||
|
{
|
||||||
|
RootedObject obj(cx, fp->scopeChain()), scope(cx), pobj(cx);
|
||||||
|
RootedPropertyName name(cx, fp->script()->getName(pc));
|
||||||
|
RootedShape shape(cx);
|
||||||
|
|
||||||
|
MOZ_ALWAYS_TRUE(LookupName(cx, name, obj, &scope, &pobj, &shape));
|
||||||
|
MOZ_ASSERT(scope && scope->is<ModuleEnvironmentObject>());
|
||||||
|
MOZ_ASSERT(scope->as<ModuleEnvironmentObject>().hasImportBinding(name));
|
||||||
|
return FetchName<false>(cx, scope, pobj, name, shape, vp);
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
SetPropertyOperation(JSContext* cx, JSOp op, HandleValue lval, HandleId id, HandleValue rval)
|
SetPropertyOperation(JSContext* cx, JSOp op, HandleValue lval, HandleId id, HandleValue rval)
|
||||||
{
|
{
|
||||||
@ -1694,7 +1708,6 @@ CASE(JSOP_NOP)
|
|||||||
CASE(JSOP_UNUSED14)
|
CASE(JSOP_UNUSED14)
|
||||||
CASE(JSOP_BACKPATCH)
|
CASE(JSOP_BACKPATCH)
|
||||||
CASE(JSOP_UNUSED145)
|
CASE(JSOP_UNUSED145)
|
||||||
CASE(JSOP_UNUSED176)
|
|
||||||
CASE(JSOP_UNUSED177)
|
CASE(JSOP_UNUSED177)
|
||||||
CASE(JSOP_UNUSED178)
|
CASE(JSOP_UNUSED178)
|
||||||
CASE(JSOP_UNUSED179)
|
CASE(JSOP_UNUSED179)
|
||||||
@ -2819,6 +2832,17 @@ CASE(JSOP_GETNAME)
|
|||||||
}
|
}
|
||||||
END_CASE(JSOP_GETNAME)
|
END_CASE(JSOP_GETNAME)
|
||||||
|
|
||||||
|
CASE(JSOP_GETIMPORT)
|
||||||
|
{
|
||||||
|
PUSH_NULL();
|
||||||
|
MutableHandleValue rval = REGS.stackHandleAt(-1);
|
||||||
|
if (!GetImportOperation(cx, REGS.fp(), REGS.pc, rval))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
TypeScript::Monitor(cx, script, REGS.pc, rval);
|
||||||
|
}
|
||||||
|
END_CASE(JSOP_GETIMPORT)
|
||||||
|
|
||||||
CASE(JSOP_GETINTRINSIC)
|
CASE(JSOP_GETINTRINSIC)
|
||||||
{
|
{
|
||||||
ReservedRooted<Value> rval(&rootValue0);
|
ReservedRooted<Value> rval(&rootValue0);
|
||||||
|
@ -1801,7 +1801,14 @@
|
|||||||
* Stack: obj, id, val => obj
|
* Stack: obj, id, val => obj
|
||||||
*/ \
|
*/ \
|
||||||
macro(JSOP_INITHIDDENELEM, 175, "inithiddenelem", NULL, 1, 3, 1, JOF_BYTE|JOF_ELEM|JOF_SET|JOF_DETECTING) \
|
macro(JSOP_INITHIDDENELEM, 175, "inithiddenelem", NULL, 1, 3, 1, JOF_BYTE|JOF_ELEM|JOF_SET|JOF_DETECTING) \
|
||||||
macro(JSOP_UNUSED176, 176,"unused176", NULL, 1, 0, 0, JOF_BYTE) \
|
/*
|
||||||
|
* Gets the value of a module import by name and pushes it onto the stack.
|
||||||
|
* Category: Variables and Scopes
|
||||||
|
* Type: Variables
|
||||||
|
* Operands: uint32_t nameIndex
|
||||||
|
* Stack: => val
|
||||||
|
*/ \
|
||||||
|
macro(JSOP_GETIMPORT, 176,"getimport", NULL, 5, 0, 1, JOF_ATOM|JOF_NAME|JOF_TYPESET) \
|
||||||
macro(JSOP_UNUSED177, 177,"unused177", NULL, 1, 0, 0, JOF_BYTE) \
|
macro(JSOP_UNUSED177, 177,"unused177", NULL, 1, 0, 0, JOF_BYTE) \
|
||||||
macro(JSOP_UNUSED178, 178,"unused178", NULL, 1, 0, 0, JOF_BYTE) \
|
macro(JSOP_UNUSED178, 178,"unused178", NULL, 1, 0, 0, JOF_BYTE) \
|
||||||
macro(JSOP_UNUSED179, 179,"unused179", NULL, 1, 0, 0, JOF_BYTE) \
|
macro(JSOP_UNUSED179, 179,"unused179", NULL, 1, 0, 0, JOF_BYTE) \
|
||||||
|
@ -423,6 +423,12 @@ ModuleEnvironmentObject::createImportBinding(JSContext* cx, HandleAtom importNam
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
ModuleEnvironmentObject::hasImportBinding(HandlePropertyName name)
|
||||||
|
{
|
||||||
|
return importBindings().has(NameToId(name));
|
||||||
|
}
|
||||||
|
|
||||||
/* static */ bool
|
/* static */ bool
|
||||||
ModuleEnvironmentObject::lookupProperty(JSContext* cx, HandleObject obj, HandleId id,
|
ModuleEnvironmentObject::lookupProperty(JSContext* cx, HandleObject obj, HandleId id,
|
||||||
MutableHandleObject objp, MutableHandleShape propp)
|
MutableHandleObject objp, MutableHandleShape propp)
|
||||||
|
@ -401,6 +401,8 @@ class ModuleEnvironmentObject : public LexicalScopeBase
|
|||||||
bool createImportBinding(JSContext* cx, HandleAtom importName, HandleModuleObject module,
|
bool createImportBinding(JSContext* cx, HandleAtom importName, HandleModuleObject module,
|
||||||
HandleAtom exportName);
|
HandleAtom exportName);
|
||||||
|
|
||||||
|
bool hasImportBinding(HandlePropertyName name);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static bool lookupProperty(JSContext* cx, HandleObject obj, HandleId id,
|
static bool lookupProperty(JSContext* cx, HandleObject obj, HandleId id,
|
||||||
MutableHandleObject objp, MutableHandleShape propp);
|
MutableHandleObject objp, MutableHandleShape propp);
|
||||||
|
Loading…
Reference in New Issue
Block a user