diff options
Diffstat (limited to 'vm.d')
| -rw-r--r-- | vm.d | 34 |
1 files changed, 34 insertions, 0 deletions
@@ -82,6 +82,15 @@ class VM { } writeln("\n--"); + /* + write(" globals >"); + //for (int i = 0; i < this.topOffset; i++) { + foreach (Value val; globals) { + writef("[ %s ]", printableValue(val)); + } + writeln("\n--"); + */ + disassemble(this.func.chunk, this.ip); ubyte inst; switch (inst = this.readByte()) { @@ -94,6 +103,23 @@ class VM { Value val = pop(); globals[asString(name)] = val; break; + case OpCode.OP_GET_LOCAL: + ubyte slot = readByte(); + writefln("getting local '%d' stackTop '%d'", slot, topOffset); + //push(stack[topOffset + slot - 2]); + //push(stack[topOffset + slot]); + push(stack[topOffset - 2 + slot]); + //push(stack[slot]); + break; + case OpCode.OP_SET_LOCAL: + //writeln("in SET_LOCAL"); + ubyte slot = readByte(); + //stack[slot] = peek(0); + stack[topOffset + slot - 1] = peek(0); + //pop(); + //stack[slot] = pop(); + writefln("setting local '%d' stackTop '%d'", slot, topOffset); + break; case OpCode.OP_GET_GLOBAL: writeln("in OP_GET_GLOBAL"); Value name = func.chunk.constants[readByte()]; @@ -171,6 +197,14 @@ class VM { Value ret = this.pop(); writefln("returned %s", printableValue(ret)); return InterpretResult.OK; + case OpCode.OP_POP: + pop(); + break; + case OpCode.OP_POP_SCOPE: // pop the n-1 position + Value val = pop(); + pop(); // throw this one away + push(val); + break; default: writeln("unknown opcode to run"); break; |
