From 7cf2065be92855b5b1db31a4bb7afbb4af29a817 Mon Sep 17 00:00:00 2001 From: Carson Fleming Date: Sun, 29 Mar 2026 08:28:28 -1000 Subject: calling functions and some optimizations --- ast.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'ast.c') 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; } } -- cgit v1.2.3