Implement OP_VARARG

Mon, 22 Nov 2010 04:53:09 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Mon, 22 Nov 2010 04:53:09 +0000
changeset 123
f8518f015ec3
parent 122
b6956a682885
child 124
62354487e1ce

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);

mercurial