aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-27 14:22:19 +0200
committerBad Diode <bd@badd10de.dev>2021-10-27 14:22:19 +0200
commit9460f325d22fac3962a3452ce25a24b04d22e665 (patch)
tree836a3a6c4cb4b1f6403119983e29383637f6babb
parentad659dca44892a5f2ba4e088603a819af58a5819 (diff)
downloadbdl-9460f325d22fac3962a3452ce25a24b04d22e665.tar.gz
bdl-9460f325d22fac3962a3452ce25a24b04d22e665.zip
Fix function call bug with number of locals
-rwxr-xr-xsrc/bytecode/vm.h5
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