From b48e27f5cc31af65d8bb92d4b81cd03a60c5bcdb Mon Sep 17 00:00:00 2001 From: Carson Fleming Date: Thu, 6 Aug 2026 00:24:49 -0400 Subject: clean up yesterday's hacks + functions in type system --- ast.c | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) (limited to 'ast.c') diff --git a/ast.c b/ast.c index c491c42..fe65f4e 100644 --- a/ast.c +++ b/ast.c @@ -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); } -- cgit v1.2.3