[JAEGER] Added JSOP_CONCATN.

This commit is contained in:
David Anderson 2010-06-06 00:49:46 -07:00
parent 54b2c073e5
commit 64882231ed
5 changed files with 30 additions and 0 deletions

View File

@ -932,6 +932,18 @@ mjit::Compiler::generateMethod()
BEGIN_CASE(JSOP_TRACE)
END_CASE(JSOP_TRACE)
BEGIN_CASE(JSOP_CONCATN)
{
uint32 argc = GET_ARGC(PC);
prepareStubCall();
masm.move(Imm32(argc), Registers::ArgReg1);
stubCall(stubs::ConcatN, Uses(argc), Defs(1));
frame.popn(argc);
frame.takeReg(Registers::ReturnReg);
frame.pushTypedPayload(JSVAL_MASK32_STRING, Registers::ReturnReg);
}
END_CASE(JSOP_CONCATN)
BEGIN_CASE(JSOP_OBJTOSTR)
jsop_objtostr();
END_CASE(JSOP_OBJTOSTR)

View File

@ -164,6 +164,7 @@ class Compiler
STUB_CALL_TYPE(JSObjStubJSObj);
STUB_CALL_TYPE(VoidStubAtom);
STUB_CALL_TYPE(JSStrStub);
STUB_CALL_TYPE(JSStrStubUInt32);
#undef STUB_CALL_TYPE
void prepareStubCall();

View File

@ -193,6 +193,7 @@ typedef JSObject * (JS_FASTCALL *JSObjStubFun)(VMFrame &, JSFunction *);
typedef JSObject * (JS_FASTCALL *JSObjStubJSObj)(VMFrame &, JSObject *);
typedef void (JS_FASTCALL *VoidStubAtom)(VMFrame &, JSAtom *);
typedef JSString * (JS_FASTCALL *JSStrStub)(VMFrame &);
typedef JSString * (JS_FASTCALL *JSStrStubUInt32)(VMFrame &, uint32);
#define JS_UNJITTABLE_METHOD (reinterpret_cast<void*>(-1))

View File

@ -2180,3 +2180,18 @@ stubs::StrictNe(VMFrame &f)
return StrictlyEqual(f.cx, lhs, rhs) != true;
}
JSString * JS_FASTCALL
stubs::ConcatN(VMFrame &f, uint32 argc)
{
JSCharBuffer buf(f.cx);
for (Value *vp = f.regs.sp - argc; vp < f.regs.sp; vp++) {
JS_ASSERT(vp->isPrimitive());
if (!js_ValueToCharBuffer(f.cx, *vp, buf))
THROWV(NULL);
}
JSString *str = js_NewStringFromCharBuffer(f.cx, buf);
if (!str)
THROWV(NULL);
return str;
}

View File

@ -54,6 +54,7 @@ JSObject * JS_FASTCALL NewArray(VMFrame &f, uint32 len);
void JS_FASTCALL InitElem(VMFrame &f, uint32 last);
void JS_FASTCALL InitProp(VMFrame &f, JSAtom *atom);
void JS_FASTCALL EndInit(VMFrame &f);
JSString * JS_FASTCALL ConcatN(VMFrame &f, uint32 argc);
void * JS_FASTCALL Call(VMFrame &f, uint32 argc);
void * JS_FASTCALL New(VMFrame &f, uint32 argc);