aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-28 12:34:15 +0200
committerBad Diode <bd@badd10de.dev>2021-10-28 12:34:15 +0200
commita8807776e6795dccfe8d2f381ae01fdb4cfb07e6 (patch)
tree8f38bc6ac2a0a3eca2a1d4edd2dbb303fc0862ff
parent7264715260fe0235413b6bd0cf6ee339e3328dc2 (diff)
downloadbdl-a8807776e6795dccfe8d2f381ae01fdb4cfb07e6.tar.gz
bdl-a8807776e6795dccfe8d2f381ae01fdb4cfb07e6.zip
Ensure closures live on the heap
-rwxr-xr-xsrc/bytecode/compiler.h1
-rwxr-xr-xsrc/bytecode/vm.h3
2 files changed, 3 insertions, 1 deletions
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) {
481 compiler->scope_depth--; 481 compiler->scope_depth--;
482 for (size_t i = 0; i < n_captured; i++) { 482 for (size_t i = 0; i < n_captured; i++) {
483 Token tok = scope->captured[i]; 483 Token tok = scope->captured[i];
484 print_token(tok);
485 parse_symbol(chunk, compiler, tok); 484 parse_symbol(chunk, compiler, tok);
486 } 485 }
487 // Number of captured values. 486 // 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) {
189 array_push(vm->stack, frame->closure->values[idx]); 189 array_push(vm->stack, frame->closure->values[idx]);
190 } break; 190 } break;
191 case OP_CAPTURE_LOCAL: { 191 case OP_CAPTURE_LOCAL: {
192 // This is a closure with captured variables. We need a copy
193 // of it that lives on the heap.
192 Object proc = array_pop(vm->stack); 194 Object proc = array_pop(vm->stack);
195 proc = make_lambda(proc.closure->chunk);
193 ssize_t n_captured = AS_FIXNUM(array_pop(vm->stack)); 196 ssize_t n_captured = AS_FIXNUM(array_pop(vm->stack));
194 for (ssize_t i = 0; i < n_captured; i++) { 197 for (ssize_t i = 0; i < n_captured; i++) {
195 Object value = array_pop(vm->stack); 198 Object value = array_pop(vm->stack);