aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/actualize.c8
-rw-r--r--src/ast.c6
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);
diff --git a/src/ast.c b/src/ast.c
index daf393e..5ba8000 100644
--- a/src/ast.c
+++ b/src/ast.c
@@ -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);