Bug 1153458 - Fix decompiler issue with DoCallNativeGetter. r=efaust

This commit is contained in:
Johannes Schulte 2015-04-11 02:17:28 +02:00
parent daae534dcc
commit ab19894824
3 changed files with 27 additions and 8 deletions

View File

@ -0,0 +1,13 @@
// |jit-test| baseline-eager; error: TypeError
try {
__defineGetter__("x", Iterator)()
} catch (e) {}
f = function() {
return (function() {
this.x
})
}()
try {
f()
} catch (e) {}
f()

View File

@ -7666,14 +7666,13 @@ ICGetProp_CallNative::Compiler::generateStubCode(MacroAssembler& masm)
Label failure;
AllocatableGeneralRegisterSet regs(availableGeneralRegs(0));
AllocatableGeneralRegisterSet regs(availableGeneralRegs(1));
Register objReg = InvalidReg;
MOZ_ASSERT(!(inputDefinitelyObject_ && outerClass_));
if (inputDefinitelyObject_) {
objReg = R0.scratchReg();
} else {
regs.take(R0);
// Guard input is an object and unbox.
masm.branchTestObject(Assembler::NotEqual, R0, &failure);
objReg = masm.extractObject(R0, ExtractTemp0);
@ -7683,12 +7682,11 @@ ICGetProp_CallNative::Compiler::generateStubCode(MacroAssembler& masm)
masm.branchTestObjClass(Assembler::NotEqual, objReg, tmp, outerClass_, &failure);
masm.loadPtr(Address(objReg, ProxyDataOffset + offsetof(ProxyDataLayout, values)), tmp);
masm.loadValue(Address(tmp, offsetof(ProxyValueArray, privateSlot)), val);
objReg = masm.extractObject(val, ExtractTemp0);
masm.movePtr(masm.extractObject(val, ExtractTemp0), objReg);
regs.add(val);
regs.add(tmp);
}
}
regs.takeUnchecked(objReg);
Register scratch = regs.takeAnyExcluding(ICTailCallReg);
@ -7704,6 +7702,13 @@ ICGetProp_CallNative::Compiler::generateStubCode(MacroAssembler& masm)
regs.add(holderReg);
}
// Box and push obj onto baseline frame stack for decompiler
if (inputDefinitelyObject_)
masm.tagValue(JSVAL_TYPE_OBJECT, objReg, R0);
EmitStowICValues(masm, 1);
if (inputDefinitelyObject_)
objReg = masm.extractObject(R0, ExtractTemp0);
// Push a stub frame so that we can perform a non-tail call.
enterStubFrame(masm, scratch);
@ -7715,15 +7720,14 @@ ICGetProp_CallNative::Compiler::generateStubCode(MacroAssembler& masm)
masm.push(objReg);
masm.push(callee);
if (!inputDefinitelyObject_)
regs.add(R0);
else
regs.add(objReg);
regs.add(R0);
if (!callVM(DoCallNativeGetterInfo, masm))
return false;
leaveStubFrame(masm);
EmitUnstowICValues(masm, 1, /* discard = */true);
// Enter type monitor IC to type-check result.
EmitEnterTypeMonitorIC(masm);

View File

@ -215,6 +215,8 @@ class Test:
test.test_join.append([name[len('test-join='):]])
elif name == 'ion-eager':
test.jitflags.append('--ion-eager')
elif name == 'baseline-eager':
test.jitflags.append('--baseline-eager')
elif name == 'dump-bytecode':
test.jitflags.append('--dump-bytecode')
elif name.startswith('--'):