OP_RETURN: Support for return values from Lua functions \o/

Wed, 07 Apr 2010 04:15:59 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Wed, 07 Apr 2010 04:15:59 +0100
changeset 19
8c9c1752272b
parent 18
ae0b4ec242a3
child 20
977ae93f612c

OP_RETURN: Support for return values from Lua functions \o/

lvm.js file | annotate | diff | comparison | revisions
--- a/lvm.js	Wed Apr 07 04:15:23 2010 +0100
+++ b/lvm.js	Wed Apr 07 04:15:59 2010 +0100
@@ -294,7 +294,8 @@
 				else
 				{
 					// Lua function
-					this.frame = {f:f,pc:0,reg:args};
+					this.frame = {f:f,pc:0,reg:args,
+						retAt:INS_A(instruction),retCount:INS_C(instruction)};
 					this.callstack.push(this.frame);
 				}
 				break;
@@ -307,8 +308,21 @@
 				this.frame.reg[INS_A(instruction)] = new LValue("function", f);
 				break;
 			case OP_RETURN:
-				this.callstack.pop();
+				var oldFrame = this.callstack.pop();
 				this.frame = this.callstack[this.callstack.length-1];
+				if(this.frame)
+				{
+					var rets;
+					if(INS_B(instruction) == 0)
+						rets = oldFrame.reg.slice(INS_A(instruction));
+					else
+						rets = oldFrame.reg.slice(INS_A(instruction),INS_A(instruction)+(INS_B(instruction)-1));
+					var i;
+					for(i=0;(oldFrame.retCount == 0||i<oldFrame.retCount)&&i<rets.length;i++)
+						this.frame.reg[oldFrame.retAt+i] = rets[i];
+					if(oldFrame.retAt+i<this.frame.reg.length)
+						this.frame.reg.splice(0,oldFrame.retAt+i);
+				}
 				break;
 			default:
 				throw "Unhandled opcode: "+INS_OPCODE(instruction);

mercurial