mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
[INFER] Don't clobber address register in FrameState::storeTo, bug 649689. r=bhackett
This commit is contained in:
parent
40a0021182
commit
5839315f83
6
js/src/jit-test/tests/jaeger/bug649689.js
Normal file
6
js/src/jit-test/tests/jaeger/bug649689.js
Normal file
@ -0,0 +1,6 @@
|
||||
function f(x) {
|
||||
eval("a = 3");
|
||||
x.p = x.p = a;
|
||||
assertEq(x.p, 3);
|
||||
}
|
||||
f({p: 2});
|
@ -1091,7 +1091,6 @@ FrameState::storeTo(FrameEntry *fe, Address address, bool popped)
|
||||
if (fe->isCopy())
|
||||
fe = fe->copyOf();
|
||||
|
||||
/* Cannot clobber the address's register. */
|
||||
JS_ASSERT(!a->freeRegs.hasReg(address.base));
|
||||
|
||||
/* If loading from memory, ensure destination differs. */
|
||||
@ -1111,12 +1110,19 @@ FrameState::storeTo(FrameEntry *fe, Address address, bool popped)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Don't clobber the address's register. */
|
||||
bool pinAddressReg = !!regstate(address.base).fe();
|
||||
if (pinAddressReg)
|
||||
pinReg(address.base);
|
||||
|
||||
#if defined JS_PUNBOX64
|
||||
if (fe->type.inMemory() && fe->data.inMemory()) {
|
||||
/* Future optimization: track that the Value is in a register. */
|
||||
RegisterID vreg = Registers::ValueReg;
|
||||
masm.loadPtr(addressOf(fe), vreg);
|
||||
masm.storePtr(vreg, address);
|
||||
if (pinAddressReg)
|
||||
unpinReg(address.base);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1219,6 +1225,8 @@ FrameState::storeTo(FrameEntry *fe, Address address, bool popped)
|
||||
fe->type.setRegister(reg);
|
||||
}
|
||||
#endif
|
||||
if (pinAddressReg)
|
||||
unpinReg(address.base);
|
||||
}
|
||||
|
||||
void
|
||||
|
Loading…
Reference in New Issue
Block a user