aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-26 15:35:36 +0200
committerBad Diode <bd@badd10de.dev>2021-10-26 15:35:36 +0200
commit6445d865ab391e3f705c41839df12f9e294eb840 (patch)
treec086488b5a0082ef5bc0b20967daefc7bfc624a5
parentfcf015508c98d16dd34d87e5df0538b44178143d (diff)
downloadbdl-6445d865ab391e3f705c41839df12f9e294eb840.tar.gz
bdl-6445d865ab391e3f705c41839df12f9e294eb840.zip
Fix parameter binding on TCO calls
-rwxr-xr-xsrc/bytecode/vm.h10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h
index ed54046..33582b1 100755
--- a/src/bytecode/vm.h
+++ b/src/bytecode/vm.h
@@ -278,9 +278,13 @@ vm_interpret(VM *vm) {
278 array_push(vm->frames, new_frame); 278 array_push(vm->frames, new_frame);
279 frame = &vm->frames[array_size(vm->frames) - 1]; 279 frame = &vm->frames[array_size(vm->frames) - 1];
280 } else { 280 } else {
281 // TODO: restore all parameters. 281 // Bind tail-call parameters.
282 Object a = array_pop(vm->stack); 282 for (size_t i = 0; i < (size_t)n_params; i++) {
283 vm->stack[frame->stack_offset] = a; 283 Object obj = array_peek(vm->stack, n_params - 1 - i);
284 vm->stack[frame->stack_offset + i] = obj;
285 }
286 // Reset stack size.
287 array_head(vm->stack)->size = frame->stack_offset + n_params;
284 } 288 }
285 vm->pc = frame->chunk->code; 289 vm->pc = frame->chunk->code;
286 } break; 290 } break;