From 64882231ed9e42184402097770003acef1d688d2 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sun, 6 Jun 2010 00:49:46 -0700 Subject: [PATCH] [JAEGER] Added JSOP_CONCATN. --- js/src/methodjit/Compiler.cpp | 12 ++++++++++++ js/src/methodjit/Compiler.h | 1 + js/src/methodjit/MethodJIT.h | 1 + js/src/methodjit/StubCalls.cpp | 15 +++++++++++++++ js/src/methodjit/StubCalls.h | 1 + 5 files changed, 30 insertions(+) diff --git a/js/src/methodjit/Compiler.cpp b/js/src/methodjit/Compiler.cpp index 4ba0db21730..ef0cde1b279 100644 --- a/js/src/methodjit/Compiler.cpp +++ b/js/src/methodjit/Compiler.cpp @@ -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) diff --git a/js/src/methodjit/Compiler.h b/js/src/methodjit/Compiler.h index 80d2a0bb376..292da0e03a5 100644 --- a/js/src/methodjit/Compiler.h +++ b/js/src/methodjit/Compiler.h @@ -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(); diff --git a/js/src/methodjit/MethodJIT.h b/js/src/methodjit/MethodJIT.h index b1b9cdbae2a..db863449663 100644 --- a/js/src/methodjit/MethodJIT.h +++ b/js/src/methodjit/MethodJIT.h @@ -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(-1)) diff --git a/js/src/methodjit/StubCalls.cpp b/js/src/methodjit/StubCalls.cpp index ffaa4370104..49ea5bfaa25 100644 --- a/js/src/methodjit/StubCalls.cpp +++ b/js/src/methodjit/StubCalls.cpp @@ -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; +} + diff --git a/js/src/methodjit/StubCalls.h b/js/src/methodjit/StubCalls.h index 60579ca484b..f9c313e9933 100644 --- a/js/src/methodjit/StubCalls.h +++ b/js/src/methodjit/StubCalls.h @@ -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);