aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/vm.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-28 12:00:24 +0200
committerBad Diode <bd@badd10de.dev>2021-10-28 12:00:24 +0200
commit8c8353dab0b4a7f6ed9332f968a5b5da67375f62 (patch)
tree9434e0197b32dbb6c65361bef920fb3190dcfc71 /src/bytecode/vm.h
parentd04aea3c5875cd2859d6ab961256b11189c49839 (diff)
downloadbdl-8c8353dab0b4a7f6ed9332f968a5b5da67375f62.tar.gz
bdl-8c8353dab0b4a7f6ed9332f968a5b5da67375f62.zip
Add tentative implementation of captured variables
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-xsrc/bytecode/vm.h19
1 files changed, 10 insertions, 9 deletions
diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h
index a32d0a1..f1c525d 100755
--- a/src/bytecode/vm.h
+++ b/src/bytecode/vm.h
@@ -177,8 +177,7 @@ vm_interpret(VM *vm) {
177 switch (instruction) { 177 switch (instruction) {
178 case OP_LOCAL: { 178 case OP_LOCAL: {
179 ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); 179 ssize_t idx = AS_FIXNUM(array_pop(vm->stack));
180 CallFrame frame = vm->frames[array_size(vm->frames) - 1]; 180 array_push(vm->stack, vm->stack[frame->stack_offset + idx]);
181 array_push(vm->stack, vm->stack[frame.stack_offset + idx]);
182 } break; 181 } break;
183 case OP_CONSTANT: { 182 case OP_CONSTANT: {
184 u8 constant = *vm->pc++; 183 u8 constant = *vm->pc++;
@@ -186,15 +185,17 @@ vm_interpret(VM *vm) {
186 array_push(vm->stack, obj); 185 array_push(vm->stack, obj);
187 } break; 186 } break;
188 case OP_CAPTURED: { 187 case OP_CAPTURED: {
189 assert(false && "not implemented"); 188 ssize_t idx = AS_FIXNUM(array_pop(vm->stack));
189 array_push(vm->stack, frame->closure->values[idx]);
190 } break; 190 } break;
191 case OP_CAPTURE_LOCAL: { 191 case OP_CAPTURE_LOCAL: {
192 assert(false && "not implemented"); 192 Object proc = array_pop(vm->stack);
193 // Object value = array_pop(vm->stack); 193 ssize_t n_captured = AS_FIXNUM(array_pop(vm->stack));
194 // ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); 194 for (size_t i = 0; i < n_captured; i++) {
195 // ssize_t depth = AS_FIXNUM(array_pop(vm->stack)); 195 Object value = array_pop(vm->stack);
196 // CallFrame frame = vm->frames[depth]; 196 array_push(proc.closure->values, value);
197 // vm->stack[frame.stack_offset + idx] = value; 197 }
198 array_push(vm->stack, proc);
198 } break; 199 } break;
199 case OP_DEF_LOCAL: { 200 case OP_DEF_LOCAL: {
200 Object value = array_pop(vm->stack); 201 Object value = array_pop(vm->stack);