diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2017-05-21 08:27:47 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2017-05-21 13:19:48 +0200 |
commit | 567c3d8dc28e99278b5db0edf53e93783e835fe9 (patch) | |
tree | 4a1aaffb2b4e847d92e754e5339d90804221a904 | |
parent | 4d15d9cc6b7035fe5d5bfa390c2d6e6c24b51914 (diff) | |
download | ell-567c3d8dc28e99278b5db0edf53e93783e835fe9.tar.gz ell-567c3d8dc28e99278b5db0edf53e93783e835fe9.tar.xz ell-567c3d8dc28e99278b5db0edf53e93783e835fe9.zip |
Fix missing argument values
-rwxr-xr-x | ell.c | 15 |
1 files changed, 8 insertions, 7 deletions
@@ -756,11 +756,12 @@ execute_args (struct context *ctx, struct item *args, struct item **res) { struct item *evaluated = NULL; if (!execute_statement (ctx, args, &evaluated)) return false; - if (evaluated) { - item_free_list (evaluated->next); - evaluated->next = NULL; - res = &(*res = evaluated)->next; - } + // Arguments should not evaporate, default to a nil value + if (!evaluated && !check (ctx, (evaluated = new_list (NULL)))) + return false; + item_free_list (evaluated->next); + evaluated->next = NULL; + res = &(*res = evaluated)->next; } return true; } @@ -806,8 +807,8 @@ execute_statement if (statement->type == ITEM_STRING) return check (ctx, (*result = new_clone (statement))); - // XXX: should this ever happen and what are the consequences? - // Shouldn't we rather clone the empty list? + // Executing a nil value results in no value. It's not very different from + // calling a block that returns no value--it's for our callers to resolve. struct item *body; if (!(body = statement->head)) return true; |