diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-02-18 23:42:10 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-02-18 23:42:10 +0330 |
commit | df4604f27bbd8ed42ea2c7026c7e4845aafd1a8b (patch) | |
tree | d877ced731ba28bf0ae8878d18b7eb392ff51404 /src/runner/runner.c | |
parent | 9eb9be33d7623a4759b0794073bd32489b865b3d (diff) |
add while
fix some memory leaks
Diffstat (limited to 'src/runner/runner.c')
-rw-r--r-- | src/runner/runner.c | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c index 0c8fbdd..54d6cfc 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -17,24 +17,24 @@ (void *)(u64)((type) * (originalType *)(op0)->metadata operator(type) * \ (originalType *)(op1)->metadata) -#define doLogicalOperation(op0, op1, operator, originalType, _type) \ +#define doLogicalOperation(op0, op1, operator, originalType, _type) \ { \ - bool res = (bool)((_type)(originalType)(op0) \ + bool res = (bool)((_type)(originalType)(op0) \ ->metadata \ - operator(_type)(originalType)(op1) \ + operator(_type)(originalType)(op1) \ ->metadata); \ astTreeDestroy(*(op0)); \ - (op0)->metadata = (void*)(u64)res; \ - (op0)->type = &AST_TREE_BOOL_TYPE; \ + (op0)->metadata = (void *)(u64)res; \ + (op0)->type = &AST_TREE_BOOL_TYPE; \ } -#define doLogicalOperationFloat(op0, op1, operator, originalType, _type) \ +#define doLogicalOperationFloat(op0, op1, operator, originalType, _type) \ { \ - bool res = (bool)(((_type) * ((originalType *)(op0)->metadata)) operator( \ - (_type) * ((originalType *)(op1)->metadata))); \ + bool res = (bool)(((_type) * ((originalType *)(op0)->metadata)) operator( \ + (_type) * ((originalType *)(op1)->metadata))); \ astTreeDestroy(*(op0)); \ - (op0)->metadata = (void*)(u64)res; \ - (op0)->type = &AST_TREE_BOOL_TYPE; \ + (op0)->metadata = (void *)(u64)res; \ + (op0)->type = &AST_TREE_BOOL_TYPE; \ } #define doLeftOperation(op0, operator, originalType, type) \ @@ -340,7 +340,20 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { astTreeDelete(tree); return ret; } - return NULL; + case AST_TREE_TOKEN_KEYWORD_WHILE: { + AstTreeWhile *metadata = expr->metadata; + AstTree *ret = NULL; + while (true) { + AstTree *tree = calcAstTreeValue(metadata->condition, pages); + bool conti = (AstTreeBool)tree->metadata; + astTreeDelete(tree); + if (!conti) { + break; + } + ret = runExpression(metadata->body, pages); + } + return ret; + } case AST_TREE_TOKEN_SCOPE: { AstTreeScope *metadata = expr->metadata; @@ -365,12 +378,20 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages) { runnerVariablePush(newPages.data[newPages.size - 1], variable); } + AstTree *ret = NULL; for (size_t i = 0; i < metadata->expressions_size; ++i) { - AstTree *r = runExpression(metadata->expressions[i], &newPages); - if (r) { - return r; + ret = runExpression(metadata->expressions[i], &newPages); + } + for (size_t i = 0; i < newPages.data[pages->size]->size; ++i) { + if (newPages.data[pages->size]->data[i]->value) { + astTreeDelete(newPages.data[pages->size]->data[i]->value); } + free(newPages.data[pages->size]->data[i]); } + free(newPages.data[pages->size]->data); + free(newPages.data[pages->size]); + free(newPages.data); + return ret; } return NULL; case AST_TREE_TOKEN_OPERATOR_PLUS: |