Wed, 07 Apr 2010 04:15:59 +0100
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);