From 142d889fc769532cae922c7ac4b0e80423d671d1 Mon Sep 17 00:00:00 2001 From: A404M Date: Wed, 12 Feb 2025 17:19:20 +0330 Subject: fix some leaks --- src/compiler/ast-tree.c | 27 +++++++++++++++++++++------ src/main.c | 2 +- src/runner/runner.c | 6 ++++-- test/main.felan | 8 +++----- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index aeb1391..f01e251 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -221,8 +221,13 @@ void astTreePrint(const AstTree *tree, int indent) { printf(",\n"); for (int i = 0; i < indent; ++i) printf(" "); - printf("body=\n"); + printf("ifBody=\n"); astTreePrint(metadata->ifBody, indent + 1); + printf(",\n"); + for (int i = 0; i < indent; ++i) + printf(" "); + printf("elseBody=\n"); + astTreePrint(metadata->elseBody, indent + 1); printf("\n"); for (int i = 0; i < indent; ++i) printf(" "); @@ -348,6 +353,9 @@ void astTreeDestroy(AstTree tree) { AstTreeIf *metadata = tree.metadata; astTreeDelete(metadata->condition); astTreeDelete(metadata->ifBody); + if (metadata->elseBody != NULL) { + astTreeDelete(metadata->elseBody); + } free(metadata); } return; @@ -1252,12 +1260,12 @@ AstTree *astTreeParseIf(ParserNode *parserNode, AstTreeHelper *helper) { } AstTree *elseBody; - if(node_metadata->elseBody != NULL){ + if (node_metadata->elseBody != NULL) { elseBody = astTreeParse(node_metadata->elseBody, helper); - if(elseBody == NULL){ + if (elseBody == NULL) { return NULL; } - }else{ + } else { elseBody = NULL; } @@ -1887,7 +1895,9 @@ bool setTypesIf(AstTree *tree, AstTreeFunction *function) { AstTreeIf *metadata = tree->metadata; if (!setAllTypes(metadata->condition, function) || - !setAllTypes(metadata->ifBody, function)) { + !setAllTypes(metadata->ifBody, function) || + (metadata->elseBody != NULL && + !setAllTypes(metadata->elseBody, function))) { return false; } @@ -1897,7 +1907,12 @@ bool setTypesIf(AstTree *tree, AstTreeFunction *function) { return false; } - tree->type = &AST_TREE_VOID_TYPE; + if (metadata->elseBody != NULL && + typeIsEqual(metadata->ifBody, metadata->elseBody)) { + tree->type = copyAstTree(metadata->ifBody); + } else { + tree->type = &AST_TREE_VOID_TYPE; + } return true; } diff --git a/src/main.c b/src/main.c index 4b7747b..8a61324 100644 --- a/src/main.c +++ b/src/main.c @@ -111,7 +111,7 @@ int main(int argc, char *argv[]) { return 1; } - const int ret = run(argv[1], true); + const int ret = run(argv[1], false); fileDelete(); return ret; } diff --git a/src/runner/runner.c b/src/runner/runner.c index 431305c..0c6e9a4 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -218,12 +218,14 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { case AST_TREE_TOKEN_KEYWORD_IF: { AstTreeIf *metadata = expr->metadata; AstTree *tree = calcAstTreeValue(metadata->condition, pages); + AstTree *ret; if ((AstTreeBool)tree->metadata) { - return runExpression(metadata->ifBody, pages); + ret = runExpression(metadata->ifBody, pages); } else { - return runExpression(metadata->elseBody, pages); + ret = runExpression(metadata->elseBody, pages); } astTreeDelete(tree); + return ret; } return NULL; case AST_TREE_TOKEN_SCOPE: { diff --git a/test/main.felan b/test/main.felan index 84cc638..6144858 100644 --- a/test/main.felan +++ b/test/main.felan @@ -1,9 +1,7 @@ main :: () -> void { b := false; - if b { - print_u64 1; - } else { + if b print_u64 2; - } + else + print_u64 3; }; - -- cgit v1.2.3