# HG changeset patch # User Matthew Wild # Date 1274706734 -3600 # Node ID 33ae4e0de8ccaf356676a8734ca75fe3f5c9cbb4 # Parent 4d2cf0b5235d849170a47fe6a4e2b0a80126734e# Parent f5244bce28cee07d15d49298b29feacca66211a5 Merge backout diff -r f5244bce28ce -r 33ae4e0de8cc lvm.js --- a/lvm.js Mon May 24 13:42:34 2010 +0100 +++ b/lvm.js Mon May 24 14:12:14 2010 +0100 @@ -290,76 +290,74 @@ }, run: function(frame) { - var instructions = frame.f.instructions; - var reg = frame.reg; var instruction; while(this.callstack.length>0) { - instruction = instructions[frame.pc++]; + instruction = frame.f.instructions[frame.pc++]; if(debugMode) { sys.puts("PC: "+(frame.pc-1)+" OP: "+instruction[0]); - sys.puts("STACK: "+sys.inspect(reg)); + sys.puts("STACK: "+sys.inspect(frame.reg)); } switch(INS_OPCODE(instruction)) { case OP_MOVE: - reg[INS_A(instruction)] = reg[INS_B(instruction)]; + frame.reg[INS_A(instruction)] = frame.reg[INS_B(instruction)]; break; case OP_LOADNIL: for(var i = INS_A(instruction);i<=INS_B(instruction);i++) - reg[i] = new LValue("nil", null); + frame.reg[i] = new LValue("nil", null); break; case OP_LOADBOOL: - reg[INS_A(instruction)] = new LValue("boolean", INS_B(instruction)!=0); + frame.reg[INS_A(instruction)] = new LValue("boolean", INS_B(instruction)!=0); if(INS_C(instruction)!=0) frame.pc++; break; case OP_GETUPVAL: - reg[INS_A(instruction)] = frame.f.upvalues[INS_B(instruction)]; + frame.reg[INS_A(instruction)] = frame.f.upvalues[INS_B(instruction)]; break; case OP_GETGLOBAL: var name = frame.f.constants[INS_Bx(instruction)]; - reg[INS_A(instruction)] = frame.f.environment.index(name); + frame.reg[INS_A(instruction)] = frame.f.environment.index(name); break; case OP_SETUPVAL: - var reg = reg[INS_A(instruction)]; + var reg = frame.reg[INS_A(instruction)]; var upvalue = frame.f.upvalues[INS_B(instruction)]; upvalue.type = reg.type; upvalue.value = reg.value; break; case OP_SETGLOBAL: var name = frame.f.constants[INS_Bx(instruction)]; - frame.f.environment.setIndex(name, reg[instruction[1]]); + frame.f.environment.setIndex(name, frame.reg[instruction[1]]); break; case OP_LOADK: var constant = frame.f.constants[INS_Bx(instruction)]; - reg[INS_A(instruction)] = new LValue(constant.type, constant.value); + frame.reg[INS_A(instruction)] = new LValue(constant.type, constant.value); break; case OP_NEWTABLE: - reg[INS_A(instruction)] = new LValue("table", {}); + frame.reg[INS_A(instruction)] = new LValue("table", {}); break; case OP_GETTABLE: var C = INS_C(instruction); - var keysource = (C&256)?frame.f.constants:reg; + var keysource = (C&256)?frame.f.constants:frame.reg; var key = keysource[C&0xff]; - var value = reg[INS_B(instruction)].index(key).value; - reg[INS_A(instruction)] = new LValueFromValue(value); + var value = frame.reg[INS_B(instruction)].index(key).value; + frame.reg[INS_A(instruction)] = new LValueFromValue(value); break; case OP_SETTABLE: var C = INS_C(instruction); - var valuesource = (C&256)?frame.f.constants:reg; + var valuesource = (C&256)?frame.f.constants:frame.reg; var value = valuesource[C&0xff]; var B = INS_B(instruction); - var keysource = (B&256)?frame.f.constants:reg; + var keysource = (B&256)?frame.f.constants:frame.reg; var key = keysource[B&0xff]; - reg[INS_A(instruction)].setIndex(key, value); + frame.reg[INS_A(instruction)].setIndex(key, value); break; case OP_CALL: - var f = reg[INS_A(instruction)].call(); // return JS or LValue + var f = frame.reg[INS_A(instruction)].call(); // return JS or LValue var A = INS_A(instruction), B = INS_B(instruction), undefined; - var args = reg.slice(A+1, B==0?undefined:(A+B)); + var args = frame.reg.slice(A+1, B==0?undefined:(A+B)); for(var i=args.length+1;i