aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/vm.h
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 /src/bytecode/vm.h
parent7264715260fe0235413b6bd0cf6ee339e3328dc2 (diff)
downloadbdl-a8807776e6795dccfe8d2f381ae01fdb4cfb07e6.tar.gz
bdl-a8807776e6795dccfe8d2f381ae01fdb4cfb07e6.zip
Ensure closures live on the heap
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-xsrc/bytecode/vm.h3
1 files changed, 3 insertions, 0 deletions
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);