diff options
| author | Carson Fleming <cflems@cflems.net> | 2026-08-06 00:24:49 -0400 |
|---|---|---|
| committer | Carson Fleming <cflems@cflems.net> | 2026-08-06 00:24:49 -0400 |
| commit | b48e27f5cc31af65d8bb92d4b81cd03a60c5bcdb (patch) | |
| tree | 0901fba9ff451968d758ed47b57ff99d1330fb8a /ast.c | |
| parent | a207a7f39514f03ddfafbe39e52a3fae57a414b4 (diff) | |
| download | ccc-b48e27f5cc31af65d8bb92d4b81cd03a60c5bcdb.tar.gz | |
clean up yesterday's hacks + functions in type system
Diffstat (limited to 'ast.c')
| -rw-r--r-- | ast.c | 41 |
1 files changed, 38 insertions, 3 deletions
@@ -47,21 +47,52 @@ static void group_destroy(struct group_node* node) { free(node->scope); } +static void type_list_destroy(struct type_list* node) { + if (node->next != NULL) { + type_list_destroy(node->next); + free(node->next); + } +} + +static void type_destroy(struct type* node) { + switch (node->type) { + case TP_FN: + type_destroy(node->fn.return_type); + free(node->fn.return_type); + + if (node->fn.arg_types != NULL) { + type_list_destroy(node->fn.arg_types); + free(node->fn.arg_types); + } + break; + case TP_DATA: + case TP_PTR: + break; + } +} + static void decl_list_destroy(struct decl_list_node* node) { + type_destroy(&node->type); decl_destroy(node->head); free(node->head); } -static void fn_arg_destroy(struct arg_decl_node* node) { +static void arg_decl_destroy(struct arg_decl_node* node) { + type_destroy(&node->type); + if (node->next != NULL) { - fn_arg_destroy(node->next); + arg_decl_destroy(node->next); free(node->next); } } static void fn_decl_destroy(struct fn_decl_node* node) { + type_destroy(&node->type); + + free(node->name); + if (node->args != NULL) { - fn_arg_destroy(node->args); + arg_decl_destroy(node->args); free(node->args); } @@ -86,6 +117,9 @@ static void str_lit_destroy(struct str_lit_node* node) { } static void call_destroy(struct call_node* node) { + expr_destroy(node->expr); + free(node->expr); + if (node->args != NULL) { expr_list_destroy(node->args); free(node->args); @@ -111,6 +145,7 @@ static void paren_destroy(struct paren_node* node) { } static void cast_destroy(struct cast_node* node) { + type_destroy(&node->type); expr_destroy(node->expr); free(node->expr); } |
