diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-27 02:25:44 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-27 02:25:44 +0330 |
commit | 8712565a385fcba4734f4d89ffb3aa40a30b4120 (patch) | |
tree | 6ad6f3feddcfd5653df4ec50e3754eb6ec86e737 | |
parent | 011414b35bdb4e7e1e819d12e9fb2f37f91b2682 (diff) |
replaced old variable system with new one in vm
-rw-r--r-- | src/compiler/ast-tree.c | 13 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 3 | ||||
-rw-r--r-- | src/runner/runner.c | 273 | ||||
-rw-r--r-- | src/runner/runner.h | 31 |
4 files changed, 58 insertions, 262 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index b626abb..4190679 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -2374,7 +2374,7 @@ AstTree *getValue(AstTree *tree, AstTreeSetTypesHelper helper) { case AST_TREE_TOKEN_KEYWORD_COMPTIME: case AST_TREE_TOKEN_SCOPE: { bool shouldRet = false; - AstTree *value = runExpression(tree, helper.pages, &shouldRet); + AstTree *value = runExpression(tree, &shouldRet); if (value == NULL) { printError(tree->str_begin, tree->str_end, "Unknown error"); } @@ -2544,23 +2544,18 @@ bool setAllTypesRoot(AstTreeRoot *root, AstTreeHelper *helper) { } } - RunnerVariablePages pages = initRootPages(); - AstTreeSetTypesHelper setTypesHelper = { .lookingType = NULL, .treeHelper = helper, - .pages = &pages, }; for (size_t i = 0; i < root->variables.size; ++i) { AstTreeVariable *variable = root->variables.data[i]; if (!setTypesAstVariable(variable, setTypesHelper)) { - destroyRootPages(pages); return false; } } - destroyRootPages(pages); return true; } @@ -2835,7 +2830,6 @@ bool setTypesPrintU64(AstTree *tree, AstTreeSetTypesHelper _helper) { AstTreeSetTypesHelper helper = { .lookingType = &AST_TREE_U64_TYPE, .treeHelper = _helper.treeHelper, - .pages = _helper.pages, }; if (!setAllTypes(metadata, helper, NULL)) { return false; @@ -2859,7 +2853,6 @@ bool setTypesReturn(AstTree *tree, AstTreeSetTypesHelper _helper, AstTreeSetTypesHelper helper = { .lookingType = getValue(function->returnType, _helper), .treeHelper = _helper.treeHelper, - .pages = _helper.pages, }; if (!setAllTypes(metadata->value, helper, NULL)) { return false; @@ -2930,7 +2923,6 @@ bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper helper) { initedArguments[j] = true; AstTreeSetTypesHelper newHelper = { .lookingType = arg->type, - .pages = helper.pages, .treeHelper = helper.treeHelper, }; @@ -2956,7 +2948,6 @@ bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper helper) { initedArguments[j] = true; AstTreeSetTypesHelper newHelper = { .lookingType = arg->type, - .pages = helper.pages, .treeHelper = helper.treeHelper, }; @@ -3090,7 +3081,6 @@ bool setTypesAstVariable(AstTreeVariable *variable, AstTreeSetTypesHelper helper = { .lookingType = &AST_TREE_TYPE_TYPE, .treeHelper = _helper.treeHelper, - .pages = _helper.pages, }; if (variable->type != NULL && !setAllTypes(variable->type, helper, NULL)) { @@ -3249,7 +3239,6 @@ bool setTypesAstInfix(AstTreeInfix *infix, AstTreeSetTypesHelper helper) { AstTreeSetTypesHelper newHelper = { .lookingType = infix->left.type, .treeHelper = helper.treeHelper, - .pages = helper.pages, }; return setAllTypes(&infix->right, newHelper, NULL); diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index da631c6..87d5c93 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -172,12 +172,9 @@ typedef struct AstTreeHelper { AstTreeVariables *globalDeps; } AstTreeHelper; -struct RunnerVariablePages; - typedef struct AstTreeSetTypesHelper { AstTree *lookingType; AstTreeHelper *treeHelper; - struct RunnerVariablePages *pages; } AstTreeSetTypesHelper; void astTreePrint(const AstTree *tree, int indent); diff --git a/src/runner/runner.c b/src/runner/runner.c index 42f5ad3..1c9ef07 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -1,7 +1,6 @@ #include "runner.h" #include "compiler/ast-tree.h" #include "utils/log.h" -#include "utils/memory.h" #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -44,97 +43,11 @@ *((originalType *)(op0)->metadata) = operator( \ (type) * (originalType *)(op0)->metadata) -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); - if (variables_size == variables->size) { - variables_size += variables_size / 2 + 1; - variables->data = a404m_realloc(variables->data, - variables_size * sizeof(*variables->data)); - } - variables->data[variables->size] = - a404m_malloc(sizeof(*variables->data[variables->size])); - variables->data[variables->size]->variable = variable; - variables->data[variables->size]->value = NULL; - variables->size += 1; -} - -void runnerVariableSetValue(RunnerVariablePages *pages, - AstTreeVariable *variable, AstTree *value) { - if (variable->isConst) { - printError(variable->name_begin, variable->name_end, - "Can't assign to const"); - exit(1); - } - for (size_t i = pages->size - 1; i != (size_t)-1ULL; --i) { - RunnerVariables *variables = pages->data[i]; - for (size_t j = 0; j < variables->size; ++j) { - RunnerVariable *var = variables->data[j]; - if (var->variable == variable) { - if (var->value != NULL) { - astTreeDelete(var->value); - } - var->value = value; - return; - } - } - } - - printError(variable->name_begin, variable->name_end, "Variable not found"); - UNREACHABLE; -} - -AstTree *runnerVariableGetValue(RunnerVariablePages *pages, - AstTreeVariable *variable) { - if (variable->isConst) { - return variable->value; - } - for (size_t i = pages->size - 1; i != (size_t)-1ULL; --i) { - RunnerVariables *variables = pages->data[i]; - for (size_t j = 0; j < variables->size; ++j) { - RunnerVariable *var = variables->data[j]; - if (var->variable == variable) { - if (var->value != NULL) { - return var->value; - } else { - return var->variable->value; - } - } - } +void runnerVariableSetValue(AstTreeVariable *variable, AstTree *value) { + if (variable->value != NULL) { + astTreeDelete(variable->value); } - - printError(variable->name_begin, variable->name_end, "Variable not found"); - UNREACHABLE; -} - -RunnerVariablePages initRootPages() { - RunnerVariablePages pages = { - .data = a404m_malloc(sizeof(*pages.data)), - .size = 1, - }; - - pages.data[pages.size - 1] = - a404m_malloc(sizeof(*pages.data[pages.size - 1])); - pages.data[pages.size - 1]->data = a404m_malloc(0); - pages.data[pages.size - 1]->size = 0; - - return pages; -} - -void destroyRootPages(RunnerVariablePages pages) { - runnerVariablesDelete(pages.data[pages.size - 1]); - free(pages.data); + variable->value = value; } bool runAstTree(AstTreeRoot *root) { @@ -142,18 +55,9 @@ bool runAstTree(AstTreeRoot *root) { constexpr size_t MAIN_STR_SIZE = (sizeof(MAIN_STR) / sizeof(*MAIN_STR)) - sizeof(*MAIN_STR); - RunnerVariablePages pages = initRootPages(); - for (size_t i = 0; i < root->variables.size; ++i) { AstTreeVariable *variable = root->variables.data[i]; - if (variable->isConst) { - runnerVariablePush(pages.data[pages.size - 1], variable); - } - } - - for (size_t i = 0; i < root->variables.size; ++i) { - AstTreeVariable *variable = root->variables.data[i]; - AstTree *variable_value = runnerVariableGetValue(&pages, variable); + AstTree *variable_value = variable->value; size_t name_size = variable->name_end - variable->name_begin; if (name_size == MAIN_STR_SIZE && strncmp(variable->name_begin, MAIN_STR, MAIN_STR_SIZE) == 0 && @@ -162,36 +66,19 @@ bool runAstTree(AstTreeRoot *root) { AstTree *main = copyAstTree(variable_value); const bool ret = - runAstTreeFunction(main, NULL, 0, &pages) == &AST_TREE_VOID_VALUE; + runAstTreeFunction(main, NULL, 0) == &AST_TREE_VOID_VALUE; astTreeDelete(main); - destroyRootPages(pages); return ret; } } - destroyRootPages(pages); printLog("main function is not found"); return false; } AstTree *runAstTreeFunction(AstTree *tree, AstTreeFunctionCallParam *arguments, - size_t arguments_size, - RunnerVariablePages *_pages) { + size_t arguments_size) { AstTreeFunction *function = tree->metadata; - RunnerVariablePages pages = { - .data = a404m_malloc((_pages->size + 1) * sizeof(*pages.data)), - .size = _pages->size + 1, - }; - - for (size_t i = 0; i < _pages->size; ++i) { - pages.data[i] = _pages->data[i]; - } - - pages.data[pages.size - 1] = - a404m_malloc(sizeof(*pages.data[pages.size - 1])); - pages.data[pages.size - 1]->data = a404m_malloc(0); - pages.data[pages.size - 1]->size = 0; - bool shouldRet = false; bool initedArguments[function->arguments.size]; @@ -211,9 +98,8 @@ AstTree *runAstTreeFunction(AstTree *tree, AstTreeFunctionCallParam *arguments, strncmp(arg->name_begin, param.nameBegin, param_name_size) == 0) { initedArguments[j] = true; - AstTree *value = runExpression(param.value, &pages, &shouldRet); - runnerVariablePush(pages.data[pages.size - 1], arg); - runnerVariableSetValue(&pages, arg, value); + AstTree *value = runExpression(param.value, &shouldRet); + runnerVariableSetValue(arg, value); goto END_OF_NAMED_FOR; } } @@ -232,9 +118,8 @@ AstTree *runAstTreeFunction(AstTree *tree, AstTreeFunctionCallParam *arguments, if (!initedArguments[j]) { initedArguments[j] = true; - AstTree *value = runExpression(param.value, &pages, &shouldRet); - runnerVariablePush(pages.data[pages.size - 1], arg); - runnerVariableSetValue(&pages, arg, value); + AstTree *value = runExpression(param.value, &shouldRet); + runnerVariableSetValue(arg, value); goto END_OF_UNNAMED_FOR; } } @@ -251,47 +136,30 @@ AstTree *runAstTreeFunction(AstTree *tree, AstTreeFunctionCallParam *arguments, if (arg->value == NULL) { printError(arg->name_begin, arg->name_end, "Argument is not initialized"); - } else { - runnerVariablePush(pages.data[pages.size - 1], arg); } } } shouldRet = false; - for (size_t i = arguments_size; i < function->arguments.size; ++i) { - AstTreeVariable *variable = function->arguments.data[i]; - runnerVariablePush(pages.data[pages.size - 1], variable); - } - - for (size_t i = 0; i < function->scope.variables.size; ++i) { - AstTreeVariable *variable = function->scope.variables.data[i]; - runnerVariablePush(pages.data[pages.size - 1], variable); - } - AstTree *ret = &AST_TREE_VOID_VALUE; for (size_t i = 0; i < function->scope.expressions_size; ++i) { - AstTree *r = - runExpression(function->scope.expressions[i], &pages, &shouldRet); + astTreeDelete(ret); + ret = runExpression(function->scope.expressions[i], &shouldRet); if (shouldRet) { - ret = r; break; } } - runnerVariablesDelete(pages.data[pages.size - 1]); - free(pages.data); - return ret; } -AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, - bool *shouldRet) { +AstTree *runExpression(AstTree *expr, bool *shouldRet) { switch (expr->token) { case AST_TREE_TOKEN_KEYWORD_PRINT_U64: { AstTreeSingleChild *metadata = expr->metadata; - AstTree *tree = runExpression(metadata, pages, shouldRet); + AstTree *tree = runExpression(metadata, shouldRet); printf("%lu", (AstTreeInt)tree->metadata); astTreeDelete(tree); return &AST_TREE_VOID_VALUE; @@ -300,9 +168,9 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, AstTreeFunctionCall *metadata = expr->metadata; if (metadata->function->token == AST_TREE_TOKEN_VARIABLE) { AstTreeVariable *variable = metadata->function->metadata; - AstTree *function = copyAstTree(runnerVariableGetValue(pages, variable)); + AstTree *function = copyAstTree(variable->value); AstTree *result = runAstTreeFunction(function, metadata->parameters, - metadata->parameters_size, pages); + metadata->parameters_size); astTreeDelete(function); return result; } else { @@ -313,8 +181,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, AstTreeInfix *metadata = expr->metadata; if (metadata->left.token == AST_TREE_TOKEN_VARIABLE) { AstTreeVariable *left = metadata->left.metadata; - runnerVariableSetValue(pages, left, - runExpression(&metadata->right, pages, shouldRet)); + runnerVariableSetValue(left, runExpression(&metadata->right, shouldRet)); return copyAstTree(left->value); } else { UNREACHABLE; @@ -324,25 +191,24 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, AstTreeReturn *metadata = expr->metadata; *shouldRet = true; if (metadata->value != NULL) { - return runExpression(metadata->value, pages, shouldRet); + return runExpression(metadata->value, shouldRet); } else { return &AST_TREE_VOID_VALUE; } } case AST_TREE_TOKEN_VARIABLE_DEFINE: { AstTreeVariable *variable = expr->metadata; - runnerVariableSetValue(pages, variable, - runExpression(variable->value, pages, shouldRet)); + runnerVariableSetValue(variable, runExpression(variable->value, shouldRet)); return &AST_TREE_VOID_VALUE; } case AST_TREE_TOKEN_KEYWORD_IF: { AstTreeIf *metadata = expr->metadata; - AstTree *condition = runExpression(metadata->condition, pages, shouldRet); + AstTree *condition = runExpression(metadata->condition, shouldRet); AstTree *ret; if ((AstTreeBool)condition->metadata) { - ret = runExpression(metadata->ifBody, pages, shouldRet); + ret = runExpression(metadata->ifBody, shouldRet); } else if (metadata->elseBody != NULL) { - ret = runExpression(metadata->elseBody, pages, shouldRet); + ret = runExpression(metadata->elseBody, shouldRet); } else { ret = &AST_TREE_VOID_VALUE; } @@ -353,62 +219,32 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, AstTreeWhile *metadata = expr->metadata; AstTree *ret = NULL; while (!*shouldRet) { - AstTree *tree = runExpression(metadata->condition, pages, shouldRet); + AstTree *tree = runExpression(metadata->condition, shouldRet); bool conti = (AstTreeBool)tree->metadata; astTreeDelete(tree); if (!conti) { break; } - ret = runExpression(metadata->body, pages, shouldRet); + ret = runExpression(metadata->body, shouldRet); } return ret; } case AST_TREE_TOKEN_KEYWORD_COMPTIME: { AstTreeSingleChild *operand = expr->metadata; - return runExpression((AstTree *)operand, pages, shouldRet); + return runExpression((AstTree *)operand, shouldRet); } case AST_TREE_TOKEN_SCOPE: { AstTreeScope *metadata = expr->metadata; - RunnerVariablePages newPages = { - .data = a404m_malloc((pages->size + 1) * sizeof(*newPages.data)), - .size = pages->size + 1, - }; - - for (size_t i = 0; i < pages->size; ++i) { - newPages.data[i] = pages->data[i]; - } - - newPages.data[pages->size] = - a404m_malloc(sizeof(*newPages.data[pages->size])); - newPages.data[pages->size]->size = 0; - newPages.data[pages->size]->data = - a404m_malloc(newPages.data[pages->size]->size * - sizeof(*newPages.data[pages->size]->data)); - - for (size_t i = 0; i < metadata->variables.size; ++i) { - AstTreeVariable *variable = metadata->variables.data[i]; - runnerVariablePush(newPages.data[newPages.size - 1], variable); - } - AstTree *ret = &AST_TREE_VOID_VALUE; for (size_t i = 0; i < metadata->expressions_size && !*shouldRet; ++i) { - ret = runExpression(metadata->expressions[i], &newPages, shouldRet); - } - 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]); + astTreeDelete(ret); + ret = runExpression(metadata->expressions[i], shouldRet); } - free(newPages.data[pages->size]->data); - free(newPages.data[pages->size]); - free(newPages.data); return ret; } case AST_TREE_TOKEN_OPERATOR_PLUS: { - AstTreeSingleChild *operand = - runExpression(expr->metadata, pages, shouldRet); + AstTreeSingleChild *operand = runExpression(expr->metadata, shouldRet); if (operand->type == &AST_TREE_U64_TYPE) { doLeftOperation(operand, +, AstTreeInt, u64); } else if (operand->type == &AST_TREE_I64_TYPE) { @@ -440,8 +276,7 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, return operand; } case AST_TREE_TOKEN_OPERATOR_MINUS: { - AstTreeSingleChild *operand = - runExpression(expr->metadata, pages, shouldRet); + AstTreeSingleChild *operand = runExpression(expr->metadata, shouldRet); if (operand->type == &AST_TREE_U64_TYPE) { doLeftOperation(operand, -, AstTreeInt, u64); } else if (operand->type == &AST_TREE_I64_TYPE) { @@ -474,8 +309,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, } case AST_TREE_TOKEN_OPERATOR_SUM: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, pages, shouldRet); - AstTree *right = runExpression(&metadata->right, pages, shouldRet); + AstTree *left = runExpression(&metadata->left, shouldRet); + AstTree *right = runExpression(&metadata->right, shouldRet); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, +, AstTreeInt, u64); @@ -521,8 +356,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, } case AST_TREE_TOKEN_OPERATOR_SUB: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, pages, shouldRet); - AstTree *right = runExpression(&metadata->right, pages, shouldRet); + AstTree *left = runExpression(&metadata->left, shouldRet); + AstTree *right = runExpression(&metadata->right, shouldRet); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, -, AstTreeInt, u64); @@ -568,8 +403,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, } case AST_TREE_TOKEN_OPERATOR_MULTIPLY: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, pages, shouldRet); - AstTree *right = runExpression(&metadata->right, pages, shouldRet); + AstTree *left = runExpression(&metadata->left, shouldRet); + AstTree *right = runExpression(&metadata->right, shouldRet); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, *, AstTreeInt, u64); @@ -615,8 +450,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, } case AST_TREE_TOKEN_OPERATOR_DIVIDE: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, pages, shouldRet); - AstTree *right = runExpression(&metadata->right, pages, shouldRet); + AstTree *left = runExpression(&metadata->left, shouldRet); + AstTree *right = runExpression(&metadata->right, shouldRet); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, /, AstTreeInt, u64); @@ -662,8 +497,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, } case AST_TREE_TOKEN_OPERATOR_MODULO: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, pages, shouldRet); - AstTree *right = runExpression(&metadata->right, pages, shouldRet); + AstTree *left = runExpression(&metadata->left, shouldRet); + AstTree *right = runExpression(&metadata->right, shouldRet); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, %, AstTreeInt, u64); @@ -697,8 +532,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, } case AST_TREE_TOKEN_OPERATOR_EQUAL: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, pages, shouldRet); - AstTree *right = runExpression(&metadata->right, pages, shouldRet); + AstTree *left = runExpression(&metadata->left, shouldRet); + AstTree *right = runExpression(&metadata->right, shouldRet); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, ==, AstTreeInt, u64); @@ -750,8 +585,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, } case AST_TREE_TOKEN_OPERATOR_NOT_EQUAL: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, pages, shouldRet); - AstTree *right = runExpression(&metadata->right, pages, shouldRet); + AstTree *left = runExpression(&metadata->left, shouldRet); + AstTree *right = runExpression(&metadata->right, shouldRet); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, !=, AstTreeInt, u64); @@ -803,8 +638,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, } case AST_TREE_TOKEN_OPERATOR_GREATER: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, pages, shouldRet); - AstTree *right = runExpression(&metadata->right, pages, shouldRet); + AstTree *left = runExpression(&metadata->left, shouldRet); + AstTree *right = runExpression(&metadata->right, shouldRet); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, >, AstTreeInt, u64); @@ -850,8 +685,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, } case AST_TREE_TOKEN_OPERATOR_SMALLER: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, pages, shouldRet); - AstTree *right = runExpression(&metadata->right, pages, shouldRet); + AstTree *left = runExpression(&metadata->left, shouldRet); + AstTree *right = runExpression(&metadata->right, shouldRet); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, <, AstTreeInt, u64); @@ -897,8 +732,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, } case AST_TREE_TOKEN_OPERATOR_GREATER_OR_EQUAL: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, pages, shouldRet); - AstTree *right = runExpression(&metadata->right, pages, shouldRet); + AstTree *left = runExpression(&metadata->left, shouldRet); + AstTree *right = runExpression(&metadata->right, shouldRet); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, >=, AstTreeInt, u64); @@ -944,8 +779,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, } case AST_TREE_TOKEN_OPERATOR_SMALLER_OR_EQUAL: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, pages, shouldRet); - AstTree *right = runExpression(&metadata->right, pages, shouldRet); + AstTree *left = runExpression(&metadata->left, shouldRet); + AstTree *right = runExpression(&metadata->right, shouldRet); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, <=, AstTreeInt, u64); @@ -1019,8 +854,8 @@ AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, } case AST_TREE_TOKEN_VARIABLE: { AstTreeVariable *variable = expr->metadata; - AstTree *value = runnerVariableGetValue(pages, variable); - return runExpression(value, pages, shouldRet); + AstTree *value = variable->value; + return runExpression(value, shouldRet); } case AST_TREE_TOKEN_FUNCTION: case AST_TREE_TOKEN_NONE: diff --git a/src/runner/runner.h b/src/runner/runner.h index fd64d1e..efb3eb8 100644 --- a/src/runner/runner.h +++ b/src/runner/runner.h @@ -3,36 +3,11 @@ #include "compiler/ast-tree.h" #include <stdint.h> -typedef struct RunnerVariable { - AstTreeVariable *variable; - AstTree *value; -} RunnerVariable; - -typedef struct RunnerVariables { - RunnerVariable **data; - size_t size; -} RunnerVariables; - -typedef struct RunnerVariablePages { - RunnerVariables **data; - 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); - -RunnerVariablePages initRootPages(); -void destroyRootPages(RunnerVariablePages pages); +void runnerVariableSetValue(AstTreeVariable *variable,AstTree *value); bool runAstTree(AstTreeRoot *root); AstTree *runAstTreeFunction(AstTree *tree, AstTreeFunctionCallParam *arguments, - size_t arguments_size, RunnerVariablePages *pages); + size_t arguments_size); -AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages, - bool *shouldRet); +AstTree *runExpression(AstTree *expr, bool *shouldRet); |