From: Wolfgang (Blub) Bumiller Date: Sat, 18 Aug 2012 14:27:40 +0000 (+0200) Subject: ast_block_collect: add to ast_block->collect and set the node's .keep=true, those... X-Git-Tag: 0.1-rc1~207 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=b6ab0207b1b18a9a8eebffcfab5c61d7302b027d;p=xonotic%2Fgmqcc.git ast_block_collect: add to ast_block->collect and set the node's .keep=true, those will now always be deleted by the ast_block dtor --- diff --git a/ast.c b/ast.c index 755d0d7..cdefab6 100644 --- a/ast.c +++ b/ast.c @@ -565,18 +565,26 @@ MEM_VEC_FUNCTIONS(ast_block, ast_value*, locals) MEM_VEC_FUNCTIONS(ast_block, ast_expression*, exprs) MEM_VEC_FUNCTIONS(ast_block, ast_expression*, collect) +bool ast_block_collect(ast_block *self, ast_expression *expr) +{ + if (!ast_block_collect_add(self, expr)) + return false; + expr->expression.node.keep = true; + return true; +} + void ast_block_delete(ast_block *self) { size_t i; - for (i = 0; i < self->collect_count; ++i) - ast_unref(self->collect[i]); - MEM_VECTOR_CLEAR(self, collect); for (i = 0; i < self->exprs_count; ++i) ast_unref(self->exprs[i]); MEM_VECTOR_CLEAR(self, exprs); for (i = 0; i < self->locals_count; ++i) ast_delete(self->locals[i]); MEM_VECTOR_CLEAR(self, locals); + for (i = 0; i < self->collect_count; ++i) + ast_delete(self->collect[i]); + MEM_VECTOR_CLEAR(self, collect); ast_expression_delete((ast_expression*)self); mem_d(self); } diff --git a/ast.h b/ast.h index b7c61fb..9951216 100644 --- a/ast.h +++ b/ast.h @@ -438,6 +438,7 @@ MEM_VECTOR_PROTO(ast_block, ast_expression*, exprs); MEM_VECTOR_PROTO(ast_block, ast_expression*, collect); bool ast_block_codegen(ast_block*, ast_function*, bool lvalue, ir_value**); +bool ast_block_collect(ast_block*, ast_expression*); /* Function * diff --git a/parser.c b/parser.c index 598202d..1d9ae74 100644 --- a/parser.c +++ b/parser.c @@ -1889,9 +1889,9 @@ static bool parser_variable(parser_t *parser, ast_block *localblock) (void)!parser_t_locals_add(parser, vy); (void)!parser_t_locals_add(parser, vz); if (!ast_block_locals_add(localblock, var) || - !ast_block_collect_add(localblock, vx.var) || - !ast_block_collect_add(localblock, vy.var) || - !ast_block_collect_add(localblock, vz.var)) + !ast_block_collect(localblock, vx.var) || + !ast_block_collect(localblock, vy.var) || + !ast_block_collect(localblock, vz.var)) { parser_pop_local(parser); parser_pop_local(parser);