summaryrefslogtreecommitdiff
path: root/src/runner
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-03-27 07:11:18 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-03-27 07:11:18 +0330
commit4c7d3c1d1e71823efc47a78ef8a608ee1656b035 (patch)
tree7d76c8d28af997f13b24e80733b2580ea69ed0ae /src/runner
parent8712565a385fcba4734f4d89ffb3aa40a30b4120 (diff)
add dereferencing
Diffstat (limited to 'src/runner')
-rw-r--r--src/runner/runner.c37
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: