diff options
Diffstat (limited to 'src/runner/runner.c')
-rw-r--r-- | src/runner/runner.c | 273 |
1 files changed, 54 insertions, 219 deletions
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: |