diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-04-11 20:05:21 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-04-11 20:05:21 +0330 |
commit | f6a2a2ed20376f6ba677248b0dcf5d0ddceaeef7 (patch) | |
tree | f08d22d6c3c6bfe80a384c4eb437708d447345ec /src/runner | |
parent | 37f4ca67e760fee528b16f4a5aa56821935976a8 (diff) |
add @typeOf
Diffstat (limited to 'src/runner')
-rw-r--r-- | src/runner/runner.c | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c index 57d10fa..2f4b32f 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -344,6 +344,11 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeFunctionCallParam *arguments, } goto RETURN; } + case AST_TREE_BUILTIN_TOKEN_TYPE_OF: { + AstTree *variable = args.data[0]; + ret = copyAstTree(variable->type); + } + goto RETURN; case AST_TREE_BUILTIN_TOKEN__SIZE__: } UNREACHABLE; @@ -384,13 +389,13 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_ASSIGN: { AstTreeInfix *metadata = expr->metadata; - AstTree *l = runExpression(&metadata->left, shouldRet, true); + AstTree *l = runExpression(metadata->left, shouldRet, true); if (l->token != AST_TREE_TOKEN_VARIABLE) { UNREACHABLE; } AstTreeVariable *left = l->metadata; runnerVariableSetValue(left, - runExpression(&metadata->right, shouldRet, false)); + runExpression(metadata->right, shouldRet, false)); astTreeDelete(l); return copyAstTree(left->value); } @@ -531,8 +536,8 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_SUM: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, shouldRet, false); - AstTree *right = runExpression(&metadata->right, shouldRet, false); + AstTree *left = runExpression(metadata->left, shouldRet, false); + AstTree *right = runExpression(metadata->right, shouldRet, false); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, +, AstTreeInt, u64); @@ -580,8 +585,8 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_SUB: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, shouldRet, false); - AstTree *right = runExpression(&metadata->right, shouldRet, false); + AstTree *left = runExpression(metadata->left, shouldRet, false); + AstTree *right = runExpression(metadata->right, shouldRet, false); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, -, AstTreeInt, u64); @@ -629,8 +634,8 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_MULTIPLY: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, shouldRet, false); - AstTree *right = runExpression(&metadata->right, shouldRet, false); + AstTree *left = runExpression(metadata->left, shouldRet, false); + AstTree *right = runExpression(metadata->right, shouldRet, false); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, *, AstTreeInt, u64); @@ -678,8 +683,8 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_DIVIDE: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, shouldRet, false); - AstTree *right = runExpression(&metadata->right, shouldRet, false); + AstTree *left = runExpression(metadata->left, shouldRet, false); + AstTree *right = runExpression(metadata->right, shouldRet, false); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, /, AstTreeInt, u64); @@ -727,8 +732,8 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_MODULO: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, shouldRet, false); - AstTree *right = runExpression(&metadata->right, shouldRet, false); + AstTree *left = runExpression(metadata->left, shouldRet, false); + AstTree *right = runExpression(metadata->right, shouldRet, false); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doOperation(left, right, %, AstTreeInt, u64); @@ -763,8 +768,8 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_EQUAL: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, shouldRet, false); - AstTree *right = runExpression(&metadata->right, shouldRet, false); + AstTree *left = runExpression(metadata->left, shouldRet, false); + AstTree *right = runExpression(metadata->right, shouldRet, false); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doLogicalOperation(left, right, ==, AstTreeInt, u64); @@ -818,8 +823,8 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_NOT_EQUAL: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, shouldRet, false); - AstTree *right = runExpression(&metadata->right, shouldRet, false); + AstTree *left = runExpression(metadata->left, shouldRet, false); + AstTree *right = runExpression(metadata->right, shouldRet, false); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doLogicalOperation(left, right, !=, AstTreeInt, u64); @@ -873,8 +878,8 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_GREATER: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, shouldRet, false); - AstTree *right = runExpression(&metadata->right, shouldRet, false); + AstTree *left = runExpression(metadata->left, shouldRet, false); + AstTree *right = runExpression(metadata->right, shouldRet, false); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doLogicalOperation(left, right, >, AstTreeInt, u64); @@ -922,8 +927,8 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_SMALLER: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, shouldRet, false); - AstTree *right = runExpression(&metadata->right, shouldRet, false); + AstTree *left = runExpression(metadata->left, shouldRet, false); + AstTree *right = runExpression(metadata->right, shouldRet, false); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doLogicalOperation(left, right, <, AstTreeInt, u64); @@ -971,8 +976,8 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_GREATER_OR_EQUAL: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, shouldRet, false); - AstTree *right = runExpression(&metadata->right, shouldRet, false); + AstTree *left = runExpression(metadata->left, shouldRet, false); + AstTree *right = runExpression(metadata->right, shouldRet, false); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doLogicalOperation(left, right, >=, AstTreeInt, u64); @@ -1020,8 +1025,8 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_SMALLER_OR_EQUAL: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, shouldRet, false); - AstTree *right = runExpression(&metadata->right, shouldRet, false); + AstTree *left = runExpression(metadata->left, shouldRet, false); + AstTree *right = runExpression(metadata->right, shouldRet, false); if (left->type == &AST_TREE_U64_TYPE && right->type == &AST_TREE_U64_TYPE) { doLogicalOperation(left, right, <=, AstTreeInt, u64); @@ -1069,8 +1074,8 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, shouldRet, false); - AstTree *right = runExpression(&metadata->right, shouldRet, false); + AstTree *left = runExpression(metadata->left, shouldRet, false); + AstTree *right = runExpression(metadata->right, shouldRet, false); *(AstTreeBool *)left->metadata = *(AstTreeBool *)left->metadata && *(AstTreeBool *)right->metadata; @@ -1080,8 +1085,8 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet, bool isLeft) { } case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR: { AstTreeInfix *metadata = expr->metadata; - AstTree *left = runExpression(&metadata->left, shouldRet, false); - AstTree *right = runExpression(&metadata->right, shouldRet, false); + AstTree *left = runExpression(metadata->left, shouldRet, false); + AstTree *right = runExpression(metadata->right, shouldRet, false); *(AstTreeBool *)left->metadata = *(AstTreeBool *)left->metadata || *(AstTreeBool *)right->metadata; |