summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-12 17:19:20 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-12 17:19:20 +0330
commit142d889fc769532cae922c7ac4b0e80423d671d1 (patch)
tree5af0fc81648a9adea13ab68293cfb22fd964b726
parent188fc08d3b3095a843c24207fe3a73999b2894fb (diff)
fix some leaks
-rw-r--r--src/compiler/ast-tree.c27
-rw-r--r--src/main.c2
-rw-r--r--src/runner/runner.c6
-rw-r--r--test/main.felan8
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;
};
-