diff options
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 287c83c..15a6b86 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h | |||
@@ -288,7 +288,7 @@ vm_interpret(VM *vm) { | |||
288 | // NOTE: This is probably better handled at compilation, but for | 288 | // NOTE: This is probably better handled at compilation, but for |
289 | // now this is simpler to implement. | 289 | // now this is simpler to implement. |
290 | ssize_t n_params = proc.chunk->n_params; | 290 | ssize_t n_params = proc.chunk->n_params; |
291 | ssize_t n_locals = proc.chunk->n_locals; | 291 | ssize_t n_locals = proc.chunk->n_locals - n_params; |
292 | if (n_args < n_params) { | 292 | if (n_args < n_params) { |
293 | RUNTIME_ERROR(ERR_NOT_ENOUGH_ARGS); | 293 | RUNTIME_ERROR(ERR_NOT_ENOUGH_ARGS); |
294 | } else if (n_args > n_params) { | 294 | } else if (n_args > n_params) { |
@@ -317,7 +317,8 @@ vm_interpret(VM *vm) { | |||
317 | } else { | 317 | } else { |
318 | // Bind tail-call parameters. | 318 | // Bind tail-call parameters. |
319 | for (ssize_t i = 0; i < n_params; i++) { | 319 | for (ssize_t i = 0; i < n_params; i++) { |
320 | Object obj = array_peek(vm->stack, n_locals + n_params - 1 - i); | 320 | size_t offset = n_locals + n_params - 1 - i; |
321 | Object obj = array_peek(vm->stack, offset); | ||
321 | vm->stack[frame->stack_offset + i] = obj; | 322 | vm->stack[frame->stack_offset + i] = obj; |
322 | } | 323 | } |
323 | 324 | ||