diff options
Diffstat (limited to 'ast.c')
| -rw-r--r-- | ast.c | 22 |
1 files changed, 14 insertions, 8 deletions
@@ -4,13 +4,7 @@ static void expr_destroy(struct expr_node* node); static void stmt_destroy(struct stmt_node* node); -static void type_destroy(struct type_node* node) { - free(node->name); -} - static void var_decl_destroy(struct var_decl_node* node) { - type_destroy(&node->type); - free(node->ident); } @@ -46,8 +40,6 @@ static void group_destroy(struct group_node* node) { } static void fn_decl_destroy(struct fn_decl_node* node) { - type_destroy(&node->return_type); - free(node->name); struct var_decl_node* args_node = node->args_head; @@ -72,6 +64,17 @@ static void str_lit_destroy(struct str_lit_node* node) { free(node->val); } +static void call_destroy(struct call_node* node) { + /* don't destroy node->called_fn, this is owned by its declaration */ + struct expr_node* args_node = node->args_head; + while (args_node != NULL) { + struct expr_node* next = args_node->next; + expr_destroy(args_node); + free(args_node); + args_node = next; + } +} + static void expr_destroy(struct expr_node* node) { switch (node->type) { case EXPR_INT_LIT: @@ -87,6 +90,9 @@ static void expr_destroy(struct expr_node* node) { case EXPR_ASSIGN: assign_destroy(&node->as._assign); break; + case EXPR_CALL: + call_destroy(&node->as._call); + break; } } |
