From ebc66018d0ccec7a81935279b02d0bcfcc14b212 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sat, 5 Jun 2010 18:17:41 -0700 Subject: [PATCH] [JAEGER] Added JSOP_LAMBDA. --- js/src/methodjit/Compiler.cpp | 11 +++++++++++ js/src/methodjit/StubCalls.cpp | 22 ++++++++++++++++++++++ js/src/methodjit/StubCalls.h | 2 ++ 3 files changed, 35 insertions(+) diff --git a/js/src/methodjit/Compiler.cpp b/js/src/methodjit/Compiler.cpp index 8d4740b0864..bddd5d0d8bc 100644 --- a/js/src/methodjit/Compiler.cpp +++ b/js/src/methodjit/Compiler.cpp @@ -732,6 +732,17 @@ mjit::Compiler::generateMethod() stubCall(stubs::DefFun, Uses(0), Defs(0)); END_CASE(JSOP_DEFFUN) + BEGIN_CASE(JSOP_LAMBDA) + { + JSFunction *fun = script->getFunction(fullAtomIndex(PC)); + prepareStubCall(); + masm.move(ImmPtr(fun), Registers::ArgReg1); + stubCall(stubs::Lambda, Uses(0), Defs(1)); + frame.takeReg(Registers::ReturnReg); + frame.pushTypedPayload(JSVAL_MASK32_FUNOBJ, Registers::ReturnReg); + } + END_CASE(JSOP_LAMBDA) + BEGIN_CASE(JSOP_GETDSLOT) BEGIN_CASE(JSOP_CALLDSLOT) { diff --git a/js/src/methodjit/StubCalls.cpp b/js/src/methodjit/StubCalls.cpp index bcc6f20efdf..4821d9885d8 100644 --- a/js/src/methodjit/StubCalls.cpp +++ b/js/src/methodjit/StubCalls.cpp @@ -1855,3 +1855,25 @@ stubs::RegExp(VMFrame &f, JSObject *regex) return obj; } +JSObject * JS_FASTCALL +stubs::Lambda(VMFrame &f, JSFunction *fun) +{ + JSObject *obj = FUN_OBJECT(fun); + + JSObject *parent; + if (FUN_NULL_CLOSURE(fun)) { + parent = f.fp->scopeChain; + } else { + parent = js_GetScopeChain(f.cx, f.fp); + if (!parent) + THROWV(NULL); + } + + obj = CloneFunctionObject(f.cx, fun, parent); + if (!obj) + THROWV(NULL); + + return obj; +} + + diff --git a/js/src/methodjit/StubCalls.h b/js/src/methodjit/StubCalls.h index 746843fa126..5dec217678f 100644 --- a/js/src/methodjit/StubCalls.h +++ b/js/src/methodjit/StubCalls.h @@ -65,9 +65,11 @@ void JS_FASTCALL GetElem(VMFrame &f); void JS_FASTCALL SetElem(VMFrame &f); void JS_FASTCALL CallName(VMFrame &f, uint32 index); void JS_FASTCALL GetUpvar(VMFrame &f, uint32 index); + void JS_FASTCALL DefFun(VMFrame &f, uint32 index); JSObject * JS_FASTCALL DefLocalFun(VMFrame &f, JSFunction *fun); JSObject * JS_FASTCALL RegExp(VMFrame &f, JSObject *regex); +JSObject * JS_FASTCALL Lambda(VMFrame &f, JSFunction *fun); void JS_FASTCALL VpInc(VMFrame &f, Value *vp); void JS_FASTCALL VpDec(VMFrame &f, Value *vp);