[JAEGER] Merge.

This commit is contained in:
David Anderson 2010-08-02 15:31:47 -07:00
commit a5dd0204ab
5 changed files with 63 additions and 22 deletions

View File

@ -2499,7 +2499,7 @@ mjit::Compiler::jsop_setprop(JSAtom *atom)
Address slot(objReg, 1 << 24);
if (vr.isConstant) {
dbgInlineStoreType = masm.storeValue(Valueify(vr.u.v), slot);
dbgInlineStoreType = masm.storeValueForIC(Valueify(vr.u.v), slot);
DBGLABEL_ASSIGN(dbgInlineStoreData);
} else {
if (vr.u.s.isTypeKnown) {

View File

@ -153,25 +153,35 @@ class Assembler : public BaseAssembler
* Stores type first, then payload.
* Returns label after type store. Useful for offset verification.
*/
Label storeValue(const Value &v, Address address) {
void storeValue(const Value &v, Address address) {
jsval_layout jv;
jv.asBits = JSVAL_BITS(Jsvalify(v));
store32(ImmTag(jv.s.tag), tagOf(address));
Label l = label();
if (!v.isUndefined())
store32(Imm32(jv.s.payload.u32), payloadOf(address));
return l;
}
Label storeValue(const Value &v, BaseIndex address) {
void storeValue(const Value &v, BaseIndex address) {
jsval_layout jv;
jv.asBits = JSVAL_BITS(Jsvalify(v));
store32(ImmTag(jv.s.tag), tagOf(address));
if (!v.isUndefined())
store32(Imm32(jv.s.payload.u32), payloadOf(address));
}
/*
* Performs type store before payload store, even for Undefined.
* Returns label after type store.
*/
Label storeValueForIC(const Value &v, Address address) {
jsval_layout jv;
jv.asBits = JSVAL_BITS(Jsvalify(v));
store32(ImmTag(jv.s.tag), tagOf(address));
Label l = label();
if (!v.isUndefined())
store32(Imm32(jv.s.payload.u32), payloadOf(address));
store32(Imm32(jv.s.payload.u32), payloadOf(address));
return l;
}

View File

@ -251,14 +251,9 @@ class SetPropCompiler : public PICStubCompiler
}
uint32 shapeOffs = pic.shapeGuard + SETPROP_INLINE_SHAPE_OFFSET;
repatcher.repatch(pic.fastPathStart.dataLabel32AtOffset(shapeOffs),
obj->shape());
repatcher.repatch(pic.storeBack.dataLabel32AtOffset(inlineTypeOffset()),
offset + 4);
if (!pic.u.vr.isConstant || !Valueify(pic.u.vr.u.v).isUndefined()) {
repatcher.repatch(pic.storeBack.dataLabel32AtOffset(inlineDataOffset()),
offset);
}
repatcher.repatch(pic.fastPathStart.dataLabel32AtOffset(shapeOffs), obj->shape());
repatcher.repatch(pic.storeBack.dataLabel32AtOffset(inlineTypeOffset()), offset + 4);
repatcher.repatch(pic.storeBack.dataLabel32AtOffset(inlineDataOffset()), offset);
pic.inlinePathPatched = true;

View File

@ -205,19 +205,25 @@ class Assembler : public BaseAssembler
storePtr(imm, valueOf(address));
}
/*
* Only does one store. Returns label after store.
* This is useless, but matches NunboxAssembler's interface.
*/
Label storeValue(const Value &v, Address address) {
void storeValue(const Value &v, Address address) {
jsval_layout jv;
jv.asBits = JSVAL_BITS(Jsvalify(v));
storePtr(Imm64(jv.asBits), valueOf(address));
return label();
}
Label storeValue(const Value &v, BaseIndex address) {
void storeValue(const Value &v, BaseIndex address) {
jsval_layout jv;
jv.asBits = JSVAL_BITS(Jsvalify(v));
storePtr(Imm64(jv.asBits), valueOf(address));
}
/*
* Only does one store. Returns label after store.
* This is useless, but matches NunboxAssembler's interface.
*/
Label storeValueForIC(const Value &v, Address address) {
jsval_layout jv;
jv.asBits = JSVAL_BITS(Jsvalify(v));

View File

@ -0,0 +1,30 @@
(function () {
function f()
{
this.y = w
this.y = (void 0)
Object
}
for (a in [0, 0, 0, 0])
{
new f
}
let w = {}
})()
/* Make sure that MICs don't have the same bug. */
x = Object();
(function () {
function f()
{
x = w
x = (void 0)
Object
}
for (a in [0, 0, 0, 0])
{
new f
}
let w = {}
})()
/* Don't assert. */