diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-28 12:34:15 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-28 12:34:15 +0200 |
commit | a8807776e6795dccfe8d2f381ae01fdb4cfb07e6 (patch) | |
tree | 8f38bc6ac2a0a3eca2a1d4edd2dbb303fc0862ff /src/bytecode/vm.h | |
parent | 7264715260fe0235413b6bd0cf6ee339e3328dc2 (diff) | |
download | bdl-a8807776e6795dccfe8d2f381ae01fdb4cfb07e6.tar.gz bdl-a8807776e6795dccfe8d2f381ae01fdb4cfb07e6.zip |
Ensure closures live on the heap
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-x | src/bytecode/vm.h | 3 |
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); |