aboutsummaryrefslogtreecommitdiff
path: root/vm.d
diff options
context:
space:
mode:
Diffstat (limited to 'vm.d')
-rw-r--r--vm.d34
1 files changed, 34 insertions, 0 deletions
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;