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/compiler.h | 1 - src/bytecode/vm.h | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h index bc39d47..867d194 100755 --- a/src/bytecode/compiler.h +++ b/src/bytecode/compiler.h @@ -481,7 +481,6 @@ compile_lambda(Chunk *chunk, Compiler *compiler, Token start, StringView name) { compiler->scope_depth--; for (size_t i = 0; i < n_captured; i++) { Token tok = scope->captured[i]; - print_token(tok); parse_symbol(chunk, compiler, tok); } // Number of captured values. 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