summaryrefslogtreecommitdiff
path: root/ast.c
diff options
context:
space:
mode:
authorCarson Fleming <cflems@cflems.net>2026-08-06 00:24:49 -0400
committerCarson Fleming <cflems@cflems.net>2026-08-06 00:24:49 -0400
commitb48e27f5cc31af65d8bb92d4b81cd03a60c5bcdb (patch)
tree0901fba9ff451968d758ed47b57ff99d1330fb8a /ast.c
parenta207a7f39514f03ddfafbe39e52a3fae57a414b4 (diff)
downloadccc-b48e27f5cc31af65d8bb92d4b81cd03a60c5bcdb.tar.gz
clean up yesterday's hacks + functions in type system
Diffstat (limited to 'ast.c')
-rw-r--r--ast.c41
1 files changed, 38 insertions, 3 deletions
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);
}