diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-28 13:34:18 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-28 13:34:18 +0200 |
commit | 0ff1716f45c9494b1aa02b8ddb2541821480c5ad (patch) | |
tree | f08bbe92d279a00d451a6f1c7360a52085b23b86 /src/bytecode/vm.h | |
parent | a8807776e6795dccfe8d2f381ae01fdb4cfb07e6 (diff) | |
download | bdl-0ff1716f45c9494b1aa02b8ddb2541821480c5ad.tar.gz bdl-0ff1716f45c9494b1aa02b8ddb2541821480c5ad.zip |
Fix difference between lambda and named func calls
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-x | src/bytecode/vm.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index a02bdd1..0d1595d 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h | |||
@@ -193,6 +193,7 @@ vm_interpret(VM *vm) { | |||
193 | // of it that lives on the heap. | 193 | // of it that lives on the heap. |
194 | Object proc = array_pop(vm->stack); | 194 | Object proc = array_pop(vm->stack); |
195 | proc = make_lambda(proc.closure->chunk); | 195 | proc = make_lambda(proc.closure->chunk); |
196 | |||
196 | ssize_t n_captured = AS_FIXNUM(array_pop(vm->stack)); | 197 | ssize_t n_captured = AS_FIXNUM(array_pop(vm->stack)); |
197 | for (ssize_t i = 0; i < n_captured; i++) { | 198 | for (ssize_t i = 0; i < n_captured; i++) { |
198 | Object value = array_pop(vm->stack); | 199 | Object value = array_pop(vm->stack); |
@@ -303,7 +304,7 @@ vm_interpret(VM *vm) { | |||
303 | } break; | 304 | } break; |
304 | case OP_CALL: { | 305 | case OP_CALL: { |
305 | ssize_t n_args = AS_FIXNUM(array_pop(vm->stack)); | 306 | ssize_t n_args = AS_FIXNUM(array_pop(vm->stack)); |
306 | Object proc = array_pop(vm->stack); | 307 | Object proc = vm->stack[array_size(vm->stack) - 1 - n_args]; |
307 | 308 | ||
308 | // Check the number of arguments is correct. | 309 | // Check the number of arguments is correct. |
309 | // NOTE: This is probably better handled at compilation, but for | 310 | // NOTE: This is probably better handled at compilation, but for |
@@ -363,7 +364,7 @@ vm_interpret(VM *vm) { | |||
363 | vm->pc = frame->rp; | 364 | vm->pc = frame->rp; |
364 | array_head(vm->frames)->size--; | 365 | array_head(vm->frames)->size--; |
365 | Object ret = array_pop(vm->stack); | 366 | Object ret = array_pop(vm->stack); |
366 | array_head(vm->stack)->size = frame->stack_offset; | 367 | array_head(vm->stack)->size = frame->stack_offset - 1; |
367 | array_push(vm->stack, ret); | 368 | array_push(vm->stack, ret); |
368 | frame = &vm->frames[array_size(vm->frames) - 1]; | 369 | frame = &vm->frames[array_size(vm->frames) - 1]; |
369 | chunk = frame->closure->chunk; | 370 | chunk = frame->closure->chunk; |