diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-27 07:11:18 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-27 07:11:18 +0330 |
commit | 4c7d3c1d1e71823efc47a78ef8a608ee1656b035 (patch) | |
tree | 7d76c8d28af997f13b24e80733b2580ea69ed0ae /src/runner/runner.c | |
parent | 8712565a385fcba4734f4d89ffb3aa40a30b4120 (diff) |
add dereferencing
Diffstat (limited to 'src/runner/runner.c')
-rw-r--r-- | src/runner/runner.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c index 1c9ef07..efb91ee 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -44,6 +44,9 @@ (type) * (originalType *)(op0)->metadata) void runnerVariableSetValue(AstTreeVariable *variable, AstTree *value) { + if (variable->isConst) { + UNREACHABLE; + } if (variable->value != NULL) { astTreeDelete(variable->value); } @@ -179,13 +182,21 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet) { } case AST_TREE_TOKEN_OPERATOR_ASSIGN: { AstTreeInfix *metadata = expr->metadata; + AstTreeVariable *left; if (metadata->left.token == AST_TREE_TOKEN_VARIABLE) { - AstTreeVariable *left = metadata->left.metadata; - runnerVariableSetValue(left, runExpression(&metadata->right, shouldRet)); - return copyAstTree(left->value); + left = metadata->left.metadata; + } else if (metadata->left.token == AST_TREE_TOKEN_OPERATOR_DEREFERENCE) { + AstTree *left_metadata = metadata->left.metadata; + if (left_metadata->token != AST_TREE_TOKEN_VARIABLE) { + UNREACHABLE; + } + left = left_metadata->metadata; + left = left->value->metadata; } else { UNREACHABLE; } + runnerVariableSetValue(left, runExpression(&metadata->right, shouldRet)); + return copyAstTree(left->value); } case AST_TREE_TOKEN_KEYWORD_RETURN: { AstTreeReturn *metadata = expr->metadata; @@ -849,13 +860,25 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet) { return copyAstTree(expr); case AST_TREE_TOKEN_OPERATOR_ADDRESS: { AstTreeSingleChild *metadata = expr->metadata; - return newAstTree(AST_TREE_TOKEN_VARIABLE, metadata->metadata, - copyAstTree(expr->type), expr->str_begin, expr->str_end); + if (metadata->token != AST_TREE_TOKEN_VARIABLE) { + UNREACHABLE; + } + return copyAstTree(metadata); + } + case AST_TREE_TOKEN_OPERATOR_DEREFERENCE: { + AstTreeSingleChild *metadata = expr->metadata; + AstTree *operand = runExpression(metadata, shouldRet); + if (metadata->token != AST_TREE_TOKEN_VARIABLE) { + UNREACHABLE; + } + AstTreeVariable *variable = operand->metadata; + AstTree *ret = copyAstTree(variable->value); + astTreeDelete(operand); + return ret; } case AST_TREE_TOKEN_VARIABLE: { AstTreeVariable *variable = expr->metadata; - AstTree *value = variable->value; - return runExpression(value, shouldRet); + return copyAstTree(variable->value); } case AST_TREE_TOKEN_FUNCTION: case AST_TREE_TOKEN_NONE: |