diff options
Diffstat (limited to 'src/runner')
-rw-r--r-- | src/runner/runner.c | 25 | ||||
-rw-r--r-- | src/runner/runner.h | 2 |
2 files changed, 25 insertions, 2 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c index 30f90f4..2378387 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -6,6 +6,17 @@ #include <stdlib.h> #include <string.h> +void runnerVariablesDelete(RunnerVariables *variables) { + for (size_t i = 0; i < variables->size; ++i) { + if (variables->data[i]->value != NULL) { + astTreeDelete(variables->data[i]->value); + } + free(variables->data[i]); + } + free(variables->data); + free(variables); +} + void runnerVariablePush(RunnerVariables *variables, AstTreeVariable *variable) { size_t variables_size = a404m_malloc_usable_size(variables->data) / sizeof(*variables->data); @@ -98,9 +109,16 @@ bool runAstTree(AstTreeRoot *root) { variable_value->token == AST_TREE_TOKEN_FUNCTION) { AstTree *main = variable_value; - return runAstTreeFunction(main, NULL, 0, &pages) == &AST_TREE_VOID_VALUE; + + const bool ret = + runAstTreeFunction(main, NULL, 0, &pages) == &AST_TREE_VOID_VALUE; + runnerVariablesDelete(pages.data[pages.size - 1]); + free(pages.data); + return ret; } } + runnerVariablesDelete(pages.data[pages.size - 1]); + free(pages.data); printLog("main function is not found"); return false; } @@ -183,7 +201,7 @@ AstTree *runAstTreeFunction(AstTree *tree, AstTree **arguments, continue; case AST_TREE_TOKEN_VARIABLE_DEFINE: { AstTreeVariable *variable = expr->metadata; - runnerVariableSetValue(&pages, variable, variable->value); + runnerVariableSetValue(&pages, variable, copyAstTree(variable->value)); } continue; case AST_TREE_TOKEN_OPERATOR_SUM: @@ -204,6 +222,9 @@ AstTree *runAstTreeFunction(AstTree *tree, AstTree **arguments, } RETURN: + runnerVariablesDelete(pages.data[pages.size - 1]); + free(pages.data); + return ret; } diff --git a/src/runner/runner.h b/src/runner/runner.h index ac36e84..758ed28 100644 --- a/src/runner/runner.h +++ b/src/runner/runner.h @@ -18,6 +18,8 @@ typedef struct RunnerVariablePages { size_t size; } RunnerVariablePages; +void runnerVariablesDelete(RunnerVariables *variables); + void runnerVariablePush(RunnerVariables *variables,AstTreeVariable *variable); void runnerVariableSetValue(RunnerVariablePages *pages,AstTreeVariable *variable,AstTree *value); AstTree* runnerVariableGetValue(RunnerVariablePages *pages,AstTreeVariable *variable); |