Mercurial > lbo > hg > ylisp
changeset 166:b5f1940e8651
eval: Fix annoying bug in arguments evaluation.
In nested function calls, pushing already-evaluated arguments onto the stack
would make stack-refs point to the wrong arguments.
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Tue, 03 Sep 2019 20:05:18 +0200 |
parents | 97e8d35ede6d |
children | b28c56a172f7 |
files | src/eval.c |
diffstat | 1 files changed, 6 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/eval.c Tue Sep 03 20:01:46 2019 +0200 +++ b/src/eval.c Tue Sep 03 20:05:18 2019 +0200 @@ -28,10 +28,14 @@ return exc; } yvec_t* args = &ref->args; + yexpr_t evald_args[32]; + assert(args->len <= 32); for (size_t i = 0; i < args->len; i++) { - yexpr_t evald = + evald_args[i] = yeval(state, YVEC_AT(&call->value.list, i + 1, yexpr_t), false); - YVEC_PUSH(&state->call_stack, &evald); + } + for (size_t i = 0; i < args->len; i++) { + YVEC_PUSH(&state->call_stack, &evald_args[i]); } yexpr_t result = yeval_list_return_last(state, &ref->body, 0); for (size_t i = 0; i < args->len; i++) { @@ -143,7 +147,6 @@ yexpr_t* elem = YVEC_AT(&result.value.list, i, yexpr_t); yexpr_t elem_result = yeval(state, elem, /* in_place= */ true); - yexpr_destroy(&elem_result); } return result; }