Mon, 22 Nov 2010 04:53:09 +0000
Implement OP_VARARG
lvm.js | file | annotate | diff | comparison | revisions |
--- a/lvm.js Mon Nov 22 04:52:55 2010 +0000 +++ b/lvm.js Mon Nov 22 04:53:09 2010 +0000 @@ -36,7 +36,7 @@ var OP_SETLIST = 34; var OP_CLOSE = 35; var OP_CLOSURE = 36; -//var OP_VARARG = 37; +var OP_VARARG = 37; var debugMode = false; @@ -482,6 +482,22 @@ var B = INS_B(instruction); frame.reg[INS_A(instruction)].setIndex(RK(frame, B), RK(frame, C)); break; + case OP_VARARG: + var A = INS_A(instruction); + var prevframe = this.callstack[this.callstack.length-2]; + var base = frame.retAt+frame.f.numParameters; + var available = prevframe.reg.length - base; + var wanted = INS_B(instruction)-1; + if(wanted < 0) + wanted = available; + for(var i = 0; i<wanted; i++) + { + if(i<available) + frame.reg[A+i] = prevframe.reg[base+i+1]; + else + frame.reg[A+i] = new LValue(this, "nil", null); + } + break; case OP_CALL: var f = frame.reg[INS_A(instruction)].precall(); // return JS or LValue var A = INS_A(instruction), B = INS_B(instruction), C = INS_C(instruction);