summaryrefslogtreecommitdiff
path: root/ast.c
diff options
context:
space:
mode:
authorCarson Fleming <[email protected]>2026-03-29 08:28:28 -1000
committerCarson Fleming <[email protected]>2026-03-29 08:28:28 -1000
commit7cf2065be92855b5b1db31a4bb7afbb4af29a817 (patch)
tree773e9df00d46934f548a2d76dbe6e61aec9b21c9 /ast.c
parent50495e8f815d3d5f92b3d36369acc52a6d2ea9c4 (diff)
downloadccc-master.tar.gz
calling functions and some optimizationsHEADmaster
Diffstat (limited to 'ast.c')
-rw-r--r--ast.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/ast.c b/ast.c
index 8c3461f..7837cf8 100644
--- a/ast.c
+++ b/ast.c
@@ -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;
}
}