diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-26 15:35:36 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-26 15:35:36 +0200 |
commit | 6445d865ab391e3f705c41839df12f9e294eb840 (patch) | |
tree | c086488b5a0082ef5bc0b20967daefc7bfc624a5 /src/bytecode/vm.h | |
parent | fcf015508c98d16dd34d87e5df0538b44178143d (diff) | |
download | bdl-6445d865ab391e3f705c41839df12f9e294eb840.tar.gz bdl-6445d865ab391e3f705c41839df12f9e294eb840.zip |
Fix parameter binding on TCO calls
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-x | src/bytecode/vm.h | 10 |
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; |