From 8c8353dab0b4a7f6ed9332f968a5b5da67375f62 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 28 Oct 2021 12:00:24 +0200 Subject: Add tentative implementation of captured variables --- src/bytecode/vm.h | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'src/bytecode/vm.h') 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) { switch (instruction) { case OP_LOCAL: { ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); - CallFrame frame = vm->frames[array_size(vm->frames) - 1]; - array_push(vm->stack, vm->stack[frame.stack_offset + idx]); + array_push(vm->stack, vm->stack[frame->stack_offset + idx]); } break; case OP_CONSTANT: { u8 constant = *vm->pc++; @@ -186,15 +185,17 @@ vm_interpret(VM *vm) { array_push(vm->stack, obj); } break; case OP_CAPTURED: { - assert(false && "not implemented"); + ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); + array_push(vm->stack, frame->closure->values[idx]); } break; case OP_CAPTURE_LOCAL: { - assert(false && "not implemented"); - // Object value = array_pop(vm->stack); - // ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); - // ssize_t depth = AS_FIXNUM(array_pop(vm->stack)); - // CallFrame frame = vm->frames[depth]; - // vm->stack[frame.stack_offset + idx] = value; + Object proc = array_pop(vm->stack); + ssize_t n_captured = AS_FIXNUM(array_pop(vm->stack)); + for (size_t i = 0; i < n_captured; i++) { + Object value = array_pop(vm->stack); + array_push(proc.closure->values, value); + } + array_push(vm->stack, proc); } break; case OP_DEF_LOCAL: { Object value = array_pop(vm->stack); -- cgit v1.2.1