From f251a97d3cb46fac6cd2f5715649081f6486a106 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Tue, 8 Jun 2010 21:46:38 -0700 Subject: [PATCH] [JAEGER] Added JSOP_INSTANCEOF. --- js/src/methodjit/Compiler.cpp | 8 ++++++++ js/src/methodjit/StubCalls.cpp | 21 +++++++++++++++++++++ js/src/methodjit/StubCalls.h | 1 + 3 files changed, 30 insertions(+) diff --git a/js/src/methodjit/Compiler.cpp b/js/src/methodjit/Compiler.cpp index 5792c4c1db0..341619585f3 100644 --- a/js/src/methodjit/Compiler.cpp +++ b/js/src/methodjit/Compiler.cpp @@ -896,6 +896,14 @@ mjit::Compiler::generateMethod() frame.pop(); END_CASE(JSOP_THROW) + BEGIN_CASE(JSOP_INSTANCEOF) + prepareStubCall(); + stubCall(stubs::InstanceOf, Uses(2), Defs(1)); + frame.popn(2); + frame.takeReg(Registers::ReturnReg); + frame.pushTypedPayload(JSVAL_MASK32_BOOLEAN, Registers::ReturnReg); + END_CASE(JSOP_INSTANCEOF) + BEGIN_CASE(JSOP_LINENO) END_CASE(JSOP_LINENO) diff --git a/js/src/methodjit/StubCalls.cpp b/js/src/methodjit/StubCalls.cpp index aac1cf0960f..0a4ce71a33a 100644 --- a/js/src/methodjit/StubCalls.cpp +++ b/js/src/methodjit/StubCalls.cpp @@ -2473,3 +2473,24 @@ stubs::Arguments(VMFrame &f) THROW(); } +JSBool JS_FASTCALL +stubs::InstanceOf(VMFrame &f) +{ + JSContext *cx = f.cx; + JSFrameRegs ®s = f.regs; + + const Value &rref = regs.sp[-1]; + JSObject *obj; + if (rref.isPrimitive() || + !(obj = &rref.asObject())->map->ops->hasInstance) { + js_ReportValueError(cx, JSMSG_BAD_INSTANCEOF_RHS, + -1, rref, NULL); + THROWV(JS_FALSE); + } + const Value &lref = regs.sp[-2]; + JSBool cond = JS_FALSE; + if (!obj->map->ops->hasInstance(cx, obj, lref, &cond)) + THROWV(JS_FALSE); + return cond; +} + diff --git a/js/src/methodjit/StubCalls.h b/js/src/methodjit/StubCalls.h index 192798f086a..bbc379c1e33 100644 --- a/js/src/methodjit/StubCalls.h +++ b/js/src/methodjit/StubCalls.h @@ -128,6 +128,7 @@ void JS_FASTCALL ForName(VMFrame &f, JSAtom *atom); JSBool JS_FASTCALL ValueToBoolean(VMFrame &f); JSString * JS_FASTCALL TypeOf(VMFrame &f); +JSBool JS_FASTCALL InstanceOf(VMFrame &f); }}} /* namespace stubs,mjit,js */