From 2ad2be250a68e907b308b120b934edcbfc99ae6e Mon Sep 17 00:00:00 2001 From: Ben Winston Date: Sat, 20 May 2023 22:54:07 -0400 Subject: block scope and local variables (not really working) --- vm.d | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'vm.d') diff --git a/vm.d b/vm.d index 7955963..3988d14 100644 --- a/vm.d +++ b/vm.d @@ -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; -- cgit v1.2.3