From a8807776e6795dccfe8d2f381ae01fdb4cfb07e6 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 28 Oct 2021 12:34:15 +0200 Subject: Ensure closures live on the heap --- src/bytecode/vm.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/bytecode/vm.h') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 4ff9743..a02bdd1 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -189,7 +189,10 @@ vm_interpret(VM *vm) { array_push(vm->stack, frame->closure->values[idx]); } break; case OP_CAPTURE_LOCAL: { + // This is a closure with captured variables. We need a copy + // of it that lives on the heap. Object proc = array_pop(vm->stack); + proc = make_lambda(proc.closure->chunk); ssize_t n_captured = AS_FIXNUM(array_pop(vm->stack)); for (ssize_t i = 0; i < n_captured; i++) { Object value = array_pop(vm->stack); -- cgit v1.2.1