diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2026-02-25 22:54:10 +0200 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2026-02-25 22:55:35 +0200 |
| commit | 0dd32cca3b8ad7e2a34ec815996e68e2f81c1da1 (patch) | |
| tree | 17227de8682888a254e5b57b955246c9c6c59b80 | |
| parent | ee50ee4ef760521c0764177b3bb8fed25beb2092 (diff) | |
| download | fwd-0dd32cca3b8ad7e2a34ec815996e68e2f81c1da1.tar.gz fwd-0dd32cca3b8ad7e2a34ec815996e68e2f81c1da1.zip | |
filter out empty nodes from statement list
+ Fixes tail call analysis that was accidentally broken by
64146b46da45ce69ab380add00459f7b60fe9196
+ Kind of wasteful to first allocate empty node and then just throw it
away, but I don't have any better ideas at the moment
| -rw-r--r-- | include/fwd/ast.h | 1 | ||||
| -rw-r--r-- | src/ast.c | 13 | ||||
| -rw-r--r-- | src/parser.y | 5 |
3 files changed, 18 insertions, 1 deletions
diff --git a/include/fwd/ast.h b/include/fwd/ast.h index 1d784f1..f550647 100644 --- a/include/fwd/ast.h +++ b/include/fwd/ast.h @@ -699,6 +699,7 @@ int equiv_node_lists(struct ast *c1, struct ast *c2); struct ast *reverse_ast_list(struct ast *root); struct type *reverse_type_list(struct type *root); +struct ast *filter_empty(struct ast *root); void fix_closures(struct ast *root); #define foreach_node(iter, nodes) \ @@ -567,6 +567,19 @@ struct type *reverse_type_list(struct type *root) return new_root; } +struct ast *filter_empty(struct ast *root) +{ + struct ast *ret = root; + while (root) { + if (root->n && root->n->k == AST_EMPTY) + root->n = root->n->n; + + root = root->n; + } + + return ret; +} + void fix_closures(struct ast *root) { while (root) { diff --git a/src/parser.y b/src/parser.y index dad3210..6210a95 100644 --- a/src/parser.y +++ b/src/parser.y @@ -454,7 +454,10 @@ rev_statements | statement statements - : rev_statements { $$ = reverse_ast_list($1); fix_closures($$); } + : rev_statements { + $$ = filter_empty(reverse_ast_list($1)); + fix_closures($$); + } opt_statements : statements |
