mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
[JAEGER] Completely inline JSOP_INSTANCEOF.
This commit is contained in:
parent
0800a12fa5
commit
a7b1a1cae4
@ -2753,25 +2753,67 @@ mjit::Compiler::jsop_instanceof()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Jump typeCheck;
|
Jump firstSlow;
|
||||||
if (!rhs->isTypeKnown()) {
|
bool typeKnown = rhs->isTypeKnown();
|
||||||
|
if (!typeKnown) {
|
||||||
Jump j = frame.testFunObj(Assembler::NotEqual, rhs);
|
Jump j = frame.testFunObj(Assembler::NotEqual, rhs);
|
||||||
stubcc.linkExit(j);
|
stubcc.linkExit(j);
|
||||||
}
|
|
||||||
|
|
||||||
stubcc.leave();
|
stubcc.leave();
|
||||||
stubcc.call(stubs::InstanceOf);
|
stubcc.call(stubs::InstanceOf);
|
||||||
|
firstSlow = stubcc.masm.jump();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is sadly necessary because the error case needs the object. */
|
||||||
frame.dup();
|
frame.dup();
|
||||||
|
|
||||||
jsop_getprop(cx->runtime->atomState.classPrototypeAtom, false);
|
jsop_getprop(cx->runtime->atomState.classPrototypeAtom, false);
|
||||||
|
|
||||||
prepareStubCall();
|
/* Primitive prototypes are invalid. */
|
||||||
stubCall(stubs::FastInstanceOf, Uses(3), Defs(1));
|
rhs = frame.peek(-1);
|
||||||
frame.takeReg(Registers::ReturnReg);
|
Jump j = frame.testPrimitive(Assembler::Equal, rhs);
|
||||||
frame.popn(3);
|
stubcc.linkExit(j);
|
||||||
frame.pushTypedPayload(JSVAL_MASK32_BOOLEAN, Registers::ReturnReg);
|
|
||||||
|
|
||||||
|
/* Allocate registers up front, because of branchiness. */
|
||||||
|
FrameEntry *lhs = frame.peek(-3);
|
||||||
|
RegisterID obj = frame.copyDataIntoReg(lhs);
|
||||||
|
RegisterID proto = frame.copyDataIntoReg(rhs);
|
||||||
|
RegisterID temp = frame.allocReg();
|
||||||
|
|
||||||
|
Jump isFalse = frame.testPrimitive(Assembler::Equal, lhs);
|
||||||
|
|
||||||
|
/* Quick test to avoid wrapped objects. */
|
||||||
|
masm.loadPtr(Address(obj, offsetof(JSObject, clasp)), temp);
|
||||||
|
masm.load32(Address(temp, offsetof(JSClass, flags)), temp);
|
||||||
|
masm.and32(Imm32(JSCLASS_IS_EXTENDED), temp);
|
||||||
|
j = masm.branchTest32(Assembler::NonZero, temp, temp);
|
||||||
|
stubcc.linkExit(j);
|
||||||
|
|
||||||
|
Address protoAddr(obj, offsetof(JSObject, fslots) + JSSLOT_PROTO * sizeof(Value));
|
||||||
|
Label loop = masm.label();
|
||||||
|
|
||||||
|
/* Walk prototype chain, break out on NULL or hit. */
|
||||||
|
masm.loadData32(protoAddr, obj);
|
||||||
|
Jump isFalse2 = masm.branchTestPtr(Assembler::Zero, obj, obj);
|
||||||
|
Jump isTrue = masm.branchPtr(Assembler::NotEqual, obj, proto);
|
||||||
|
isTrue.linkTo(loop, &masm);
|
||||||
|
masm.move(Imm32(1), temp);
|
||||||
|
isTrue = masm.jump();
|
||||||
|
|
||||||
|
isFalse.linkTo(masm.label(), &masm);
|
||||||
|
isFalse2.linkTo(masm.label(), &masm);
|
||||||
|
masm.move(Imm32(0), temp);
|
||||||
|
isTrue.linkTo(masm.label(), &masm);
|
||||||
|
|
||||||
|
frame.freeReg(proto);
|
||||||
|
frame.freeReg(obj);
|
||||||
|
|
||||||
|
stubcc.leave();
|
||||||
|
stubcc.call(stubs::FastInstanceOf);
|
||||||
|
|
||||||
|
frame.popn(3);
|
||||||
|
frame.pushTypedPayload(JSVAL_MASK32_BOOLEAN, temp);
|
||||||
|
|
||||||
|
firstSlow.linkTo(stubcc.masm.label(), &stubcc.masm);
|
||||||
stubcc.rejoin(1);
|
stubcc.rejoin(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2228,7 +2228,7 @@ stubs::InstanceOf(VMFrame &f)
|
|||||||
return cond;
|
return cond;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSBool JS_FASTCALL
|
void JS_FASTCALL
|
||||||
stubs::FastInstanceOf(VMFrame &f)
|
stubs::FastInstanceOf(VMFrame &f)
|
||||||
{
|
{
|
||||||
const Value &lref = f.regs.sp[-1];
|
const Value &lref = f.regs.sp[-1];
|
||||||
@ -2239,10 +2239,10 @@ stubs::FastInstanceOf(VMFrame &f)
|
|||||||
* has a non-object as its .prototype value.
|
* has a non-object as its .prototype value.
|
||||||
*/
|
*/
|
||||||
js_ReportValueError(f.cx, JSMSG_BAD_PROTOTYPE, -1, f.regs.sp[-2], NULL);
|
js_ReportValueError(f.cx, JSMSG_BAD_PROTOTYPE, -1, f.regs.sp[-2], NULL);
|
||||||
THROWV(JS_FALSE);
|
THROW();
|
||||||
}
|
}
|
||||||
|
|
||||||
return js_IsDelegate(f.cx, &lref.asObject(), f.regs.sp[-3]);
|
f.regs.sp[-3].setBoolean(js_IsDelegate(f.cx, &lref.asObject(), f.regs.sp[-3]));
|
||||||
}
|
}
|
||||||
|
|
||||||
void JS_FASTCALL
|
void JS_FASTCALL
|
||||||
|
@ -152,7 +152,7 @@ void JS_FASTCALL ForName(VMFrame &f, JSAtom *atom);
|
|||||||
JSBool JS_FASTCALL ValueToBoolean(VMFrame &f);
|
JSBool JS_FASTCALL ValueToBoolean(VMFrame &f);
|
||||||
JSString * JS_FASTCALL TypeOf(VMFrame &f);
|
JSString * JS_FASTCALL TypeOf(VMFrame &f);
|
||||||
JSBool JS_FASTCALL InstanceOf(VMFrame &f);
|
JSBool JS_FASTCALL InstanceOf(VMFrame &f);
|
||||||
JSBool JS_FASTCALL FastInstanceOf(VMFrame &f);
|
void JS_FASTCALL FastInstanceOf(VMFrame &f);
|
||||||
void JS_FASTCALL ArgCnt(VMFrame &f);
|
void JS_FASTCALL ArgCnt(VMFrame &f);
|
||||||
void JS_FASTCALL Unbrand(VMFrame &f);
|
void JS_FASTCALL Unbrand(VMFrame &f);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user