diff options
| author | Ben Winston | 2023-05-20 22:54:07 -0400 |
|---|---|---|
| committer | Ben Winston | 2023-05-20 22:54:07 -0400 |
| commit | 2ad2be250a68e907b308b120b934edcbfc99ae6e (patch) | |
| tree | 54cd9308286cb4a368a8f7eb11ad9011c74ac58a /vm.d | |
| parent | 38dc63a67879a42f208b5642a8590e1192e8e2e5 (diff) | |
block scope and local variables (not really working)
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; |
