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;
             }