mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-24 16:17:29 +09:00
Issue #2155 - Follow-up: Reorder super-property evaluation order per latest spec change
Fix regression from difference between Interpreter (old) and ElemOpEmitter (new). We don't have any Ion/IC support for these ops. Based-on: m-c 1472211
This commit is contained in:
parent
2e63622186
commit
74032644f5
5 changed files with 14 additions and 14 deletions
|
|
@ -581,7 +581,6 @@ struct MOZ_STACK_CLASS BytecodeEmitter
|
||||||
|
|
||||||
MOZ_MUST_USE bool emitElemObjAndKey(PropertyByValue* elem, bool isSuper, ElemOpEmitter& eoe);
|
MOZ_MUST_USE bool emitElemObjAndKey(PropertyByValue* elem, bool isSuper, ElemOpEmitter& eoe);
|
||||||
MOZ_MUST_USE bool emitElemOpBase(JSOp op);
|
MOZ_MUST_USE bool emitElemOpBase(JSOp op);
|
||||||
MOZ_MUST_USE bool emitElemOp(ParseNode* pn, JSOp op);
|
|
||||||
MOZ_MUST_USE bool emitElemIncDec(ParseNode* pn);
|
MOZ_MUST_USE bool emitElemIncDec(ParseNode* pn);
|
||||||
|
|
||||||
MOZ_MUST_USE bool emitCatch(ParseNode* pn);
|
MOZ_MUST_USE bool emitCatch(ParseNode* pn);
|
||||||
|
|
@ -805,9 +804,6 @@ struct MOZ_STACK_CLASS BytecodeEmitter
|
||||||
MOZ_MUST_USE bool emitSpread(bool allowSelfHosted = false);
|
MOZ_MUST_USE bool emitSpread(bool allowSelfHosted = false);
|
||||||
|
|
||||||
MOZ_MUST_USE bool emitClass(ParseNode* pn);
|
MOZ_MUST_USE bool emitClass(ParseNode* pn);
|
||||||
MOZ_MUST_USE bool emitSuperElemOperands(ParseNode* pn,
|
|
||||||
EmitElemOption opts = EmitElemOption::Get);
|
|
||||||
MOZ_MUST_USE bool emitSuperElemOp(ParseNode* pn, JSOp op, bool isCall = false);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class MOZ_RAII AutoCheckUnstableEmitterScope {
|
class MOZ_RAII AutoCheckUnstableEmitterScope {
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,8 @@ ElemOpEmitter::prepareForKey()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isCall()) {
|
if (isCall()) {
|
||||||
|
// We need a second |this| that will be consumed during computation of
|
||||||
|
// the property value. (The original |this| is passed to the call.)
|
||||||
if (!bce_->emit1(JSOP_DUP)) { // [Super]
|
if (!bce_->emit1(JSOP_DUP)) { // [Super]
|
||||||
// // THIS THIS
|
// // THIS THIS
|
||||||
// // [Other]
|
// // [Other]
|
||||||
|
|
@ -60,6 +62,8 @@ ElemOpEmitter::emitGet()
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(state_ == State::Key);
|
MOZ_ASSERT(state_ == State::Key);
|
||||||
|
|
||||||
|
// We need to convert the key to an object id first, so that we do not do
|
||||||
|
// it inside both the GETELEM and the SETELEM.
|
||||||
if (isIncDec() || isCompoundAssignment()) {
|
if (isIncDec() || isCompoundAssignment()) {
|
||||||
if (!bce_->emit1(JSOP_TOID)) { // [Super]
|
if (!bce_->emit1(JSOP_TOID)) { // [Super]
|
||||||
// // THIS KEY
|
// // THIS KEY
|
||||||
|
|
|
||||||
|
|
@ -1330,7 +1330,7 @@ ExpressionDecompiler::decompilePC(jsbytecode* pc)
|
||||||
write("]");
|
write("]");
|
||||||
case JSOP_GETELEM_SUPER:
|
case JSOP_GETELEM_SUPER:
|
||||||
return write("super[") &&
|
return write("super[") &&
|
||||||
decompilePCForStackOperand(pc, -3) &&
|
decompilePCForStackOperand(pc, -2) &&
|
||||||
write("]");
|
write("]");
|
||||||
case JSOP_NULL:
|
case JSOP_NULL:
|
||||||
return write(js_null_str);
|
return write(js_null_str);
|
||||||
|
|
|
||||||
|
|
@ -2853,9 +2853,9 @@ END_CASE(JSOP_GETELEM)
|
||||||
|
|
||||||
CASE(JSOP_GETELEM_SUPER)
|
CASE(JSOP_GETELEM_SUPER)
|
||||||
{
|
{
|
||||||
HandleValue rval = REGS.stackHandleAt(-3);
|
|
||||||
ReservedRooted<JSObject*> receiver(&rootObject0);
|
ReservedRooted<JSObject*> receiver(&rootObject0);
|
||||||
FETCH_OBJECT(cx, -2, receiver);
|
FETCH_OBJECT(cx, -3, receiver);
|
||||||
|
HandleValue rval = REGS.stackHandleAt(-2);
|
||||||
ReservedRooted<JSObject*> obj(&rootObject1, ®S.sp[-1].toObject());
|
ReservedRooted<JSObject*> obj(&rootObject1, ®S.sp[-1].toObject());
|
||||||
|
|
||||||
MutableHandleValue res = REGS.stackHandleAt(-3);
|
MutableHandleValue res = REGS.stackHandleAt(-3);
|
||||||
|
|
@ -2897,9 +2897,9 @@ CASE(JSOP_STRICTSETELEM_SUPER)
|
||||||
static_assert(JSOP_SETELEM_SUPER_LENGTH == JSOP_STRICTSETELEM_SUPER_LENGTH,
|
static_assert(JSOP_SETELEM_SUPER_LENGTH == JSOP_STRICTSETELEM_SUPER_LENGTH,
|
||||||
"setelem-super and strictsetelem-super must be the same size");
|
"setelem-super and strictsetelem-super must be the same size");
|
||||||
|
|
||||||
|
ReservedRooted<Value> receiver(&rootValue0, REGS.sp[-4]);
|
||||||
ReservedRooted<jsid> id(&rootId0);
|
ReservedRooted<jsid> id(&rootId0);
|
||||||
FETCH_ELEMENT_ID(-4, id);
|
FETCH_ELEMENT_ID(-3, id);
|
||||||
ReservedRooted<Value> receiver(&rootValue0, REGS.sp[-3]);
|
|
||||||
ReservedRooted<JSObject*> obj(&rootObject1, ®S.sp[-2].toObject());
|
ReservedRooted<JSObject*> obj(&rootObject1, ®S.sp[-2].toObject());
|
||||||
HandleValue value = REGS.stackHandleAt(-1);
|
HandleValue value = REGS.stackHandleAt(-1);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -535,7 +535,7 @@
|
||||||
macro(JSOP_GETELEM, 55, "getelem", NULL, 1, 2, 1, JOF_BYTE |JOF_ELEM|JOF_TYPESET|JOF_LEFTASSOC) \
|
macro(JSOP_GETELEM, 55, "getelem", NULL, 1, 2, 1, JOF_BYTE |JOF_ELEM|JOF_TYPESET|JOF_LEFTASSOC) \
|
||||||
/*
|
/*
|
||||||
* Pops the top three values on the stack as 'val', 'propval' and 'obj',
|
* Pops the top three values on the stack as 'val', 'propval' and 'obj',
|
||||||
* sets 'propval' property of 'obj' as 'val', pushes 'obj' onto the
|
* sets 'propval' property of 'obj' as 'val', pushes 'val' onto the
|
||||||
* stack.
|
* stack.
|
||||||
* Category: Literals
|
* Category: Literals
|
||||||
* Type: Object
|
* Type: Object
|
||||||
|
|
@ -545,7 +545,7 @@
|
||||||
macro(JSOP_SETELEM, 56, "setelem", NULL, 1, 3, 1, JOF_BYTE |JOF_ELEM|JOF_SET|JOF_DETECTING|JOF_CHECKSLOPPY) \
|
macro(JSOP_SETELEM, 56, "setelem", NULL, 1, 3, 1, JOF_BYTE |JOF_ELEM|JOF_SET|JOF_DETECTING|JOF_CHECKSLOPPY) \
|
||||||
/*
|
/*
|
||||||
* Pops the top three values on the stack as 'val', 'propval' and 'obj',
|
* Pops the top three values on the stack as 'val', 'propval' and 'obj',
|
||||||
* sets 'propval' property of 'obj' as 'val', pushes 'obj' onto the
|
* sets 'propval' property of 'obj' as 'val', pushes 'val' onto the
|
||||||
* stack. Throws a TypeError if the set fails, per strict mode
|
* stack. Throws a TypeError if the set fails, per strict mode
|
||||||
* semantics.
|
* semantics.
|
||||||
* Category: Literals
|
* Category: Literals
|
||||||
|
|
@ -1277,7 +1277,7 @@
|
||||||
* Category: Literals
|
* Category: Literals
|
||||||
* Type: Object
|
* Type: Object
|
||||||
* Operands:
|
* Operands:
|
||||||
* Stack: receiver, obj, propval => obj[propval]
|
* Stack: receiver, propval, obj => obj[propval]
|
||||||
*/ \
|
*/ \
|
||||||
macro(JSOP_GETELEM_SUPER, 125, "getelem-super", NULL, 1, 3, 1, JOF_BYTE |JOF_ELEM|JOF_LEFTASSOC) \
|
macro(JSOP_GETELEM_SUPER, 125, "getelem-super", NULL, 1, 3, 1, JOF_BYTE |JOF_ELEM|JOF_LEFTASSOC) \
|
||||||
/*
|
/*
|
||||||
|
|
@ -1637,7 +1637,7 @@
|
||||||
* Category: Literals
|
* Category: Literals
|
||||||
* Type: Object
|
* Type: Object
|
||||||
* Operands:
|
* Operands:
|
||||||
* Stack: propval, receiver, obj, val => val
|
* Stack: receiver, propval, obj, val => val
|
||||||
*/ \
|
*/ \
|
||||||
macro(JSOP_SETELEM_SUPER, 158, "setelem-super", NULL, 1, 4, 1, JOF_BYTE |JOF_ELEM|JOF_SET|JOF_DETECTING|JOF_CHECKSLOPPY) \
|
macro(JSOP_SETELEM_SUPER, 158, "setelem-super", NULL, 1, 4, 1, JOF_BYTE |JOF_ELEM|JOF_SET|JOF_DETECTING|JOF_CHECKSLOPPY) \
|
||||||
/*
|
/*
|
||||||
|
|
@ -1646,7 +1646,7 @@
|
||||||
* Category: Literals
|
* Category: Literals
|
||||||
* Type: Object
|
* Type: Object
|
||||||
* Operands:
|
* Operands:
|
||||||
* Stack: propval, receiver, obj, val => val
|
* Stack: receiver, propval, obj, val => val
|
||||||
*/ \
|
*/ \
|
||||||
macro(JSOP_STRICTSETELEM_SUPER, 159, "strict-setelem-super", NULL, 1, 4, 1, JOF_BYTE |JOF_ELEM|JOF_SET|JOF_DETECTING|JOF_CHECKSTRICT) \
|
macro(JSOP_STRICTSETELEM_SUPER, 159, "strict-setelem-super", NULL, 1, 4, 1, JOF_BYTE |JOF_ELEM|JOF_SET|JOF_DETECTING|JOF_CHECKSTRICT) \
|
||||||
\
|
\
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue