diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2025-01-16 08:27:51 +0200 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2025-01-16 08:27:51 +0200 |
| commit | 2841470fd34a6ed41df94f925bbeb95819bfca9a (patch) | |
| tree | a13434519f5c0222f2b0c80a4d13738eb17f8200 /src | |
| parent | 9ca1d0c763e1c506ae7b43d50db225914b709397 (diff) | |
| download | ek-2841470fd34a6ed41df94f925bbeb95819bfca9a.tar.gz ek-2841470fd34a6ed41df94f925bbeb95819bfca9a.zip | |
skip a few extra allocs
Diffstat (limited to 'src')
| -rw-r--r-- | src/actualize.c | 8 | ||||
| -rw-r--r-- | src/ast.c | 6 |
2 files changed, 12 insertions, 2 deletions
diff --git a/src/actualize.c b/src/actualize.c index 991beed..5aee29b 100644 --- a/src/actualize.c +++ b/src/actualize.c @@ -1292,12 +1292,16 @@ static int actualize_block(struct act_state *state, if (state->defer_stack == defers) return 0; - block_defers(node) = clone_defers(state, defers); - if (!block_defers(node)) { + struct ast *d = clone_defers(state, defers); + if (!d) { internal_error("failed cloning defers"); clear_defers(state, defers); return -1; } + + block_defers(node) = d; + if (actualize_list(state, d->scope, d)) + return -1; } clear_defers(state, defers); @@ -422,9 +422,15 @@ struct ast *clone_ast(struct ast *n) if (n->a0) new->a0 = clone_ast_list(n->a0); + /* don't clone defers */ + if (!(n->k == AST_BLOCK)) if (n->a1) new->a1 = clone_ast_list(n->a1); + /* don't clone expanded body, just the raw one */ + if (!(n->k == AST_TRAIT_DEF + || n->k == AST_STRUCT_DEF + || n->k == AST_STRUCT_CONT_DEF)) if (n->a2) new->a2 = clone_ast_list(n->a2); |
