[INFER] Mark INCELEM opcodes accessing non-integer properties as producing unknown values, bug 653243.

This commit is contained in:
Brian Hackett 2011-05-01 16:58:01 -07:00
parent b7e3e5433b
commit d868b00326
2 changed files with 24 additions and 0 deletions

View File

@ -0,0 +1,12 @@
try {
obj[i] = "a";
} catch (e) {}
var obj = {
p: 100
};
var name = "p";
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = obj[name]--;
}
assertEq(a.join(), '100,99,98,97,96,95,94,93,92,91');

View File

@ -1833,6 +1833,9 @@ stubs::ElemInc(VMFrame &f)
if (!ObjIncOp<1, true, strict, true>(f, obj, id)) if (!ObjIncOp<1, true, strict, true>(f, obj, id))
THROW(); THROW();
f.regs.sp[-3] = f.regs.sp[-1]; f.regs.sp[-3] = f.regs.sp[-1];
if (!JSID_IS_INT(id) && !f.script()->typeMonitorUnknown(f.cx, f.pc()))
THROW();
} }
template void JS_FASTCALL stubs::ElemInc<true>(VMFrame &f); template void JS_FASTCALL stubs::ElemInc<true>(VMFrame &f);
@ -1851,6 +1854,9 @@ stubs::ElemDec(VMFrame &f)
if (!ObjIncOp<-1, true, strict, true>(f, obj, id)) if (!ObjIncOp<-1, true, strict, true>(f, obj, id))
THROW(); THROW();
f.regs.sp[-3] = f.regs.sp[-1]; f.regs.sp[-3] = f.regs.sp[-1];
if (!JSID_IS_INT(id) && !f.script()->typeMonitorUnknown(f.cx, f.pc()))
THROW();
} }
template void JS_FASTCALL stubs::ElemDec<true>(VMFrame &f); template void JS_FASTCALL stubs::ElemDec<true>(VMFrame &f);
@ -1869,6 +1875,9 @@ stubs::IncElem(VMFrame &f)
if (!ObjIncOp<1, false, strict, true>(f, obj, id)) if (!ObjIncOp<1, false, strict, true>(f, obj, id))
THROW(); THROW();
f.regs.sp[-3] = f.regs.sp[-1]; f.regs.sp[-3] = f.regs.sp[-1];
if (!JSID_IS_INT(id) && !f.script()->typeMonitorUnknown(f.cx, f.pc()))
THROW();
} }
template void JS_FASTCALL stubs::IncElem<true>(VMFrame &f); template void JS_FASTCALL stubs::IncElem<true>(VMFrame &f);
@ -1887,6 +1896,9 @@ stubs::DecElem(VMFrame &f)
if (!ObjIncOp<-1, false, strict, true>(f, obj, id)) if (!ObjIncOp<-1, false, strict, true>(f, obj, id))
THROW(); THROW();
f.regs.sp[-3] = f.regs.sp[-1]; f.regs.sp[-3] = f.regs.sp[-1];
if (!JSID_IS_INT(id) && !f.script()->typeMonitorUnknown(f.cx, f.pc()))
THROW();
} }
template void JS_FASTCALL stubs::DecElem<true>(VMFrame &f); template void JS_FASTCALL stubs::DecElem<true>(VMFrame &f);