aboutsummaryrefslogtreecommitdiff
path: root/src/runner/runner.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-05-26 01:24:56 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-05-26 01:24:56 +0330
commitafa78451df1e9fb2810d4ae8cb697b1b2071ff9c (patch)
tree9b0ad12b58522cc0f99832253b1948fdebc1158c /src/runner/runner.c
parente55d45bac0bbd3039118bffa7e6aaf01c04b991a (diff)
add shift
Diffstat (limited to 'src/runner/runner.c')
-rw-r--r--src/runner/runner.c90
1 files changed, 89 insertions, 1 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c
index 926380a..923f9af 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -1075,6 +1075,78 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope,
return newAstTree(AST_TREE_TOKEN_RAW_VALUE, ret, copyAstTree(left->type),
NULL, NULL);
}
+ case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT: {
+ AstTree *left = arguments[0];
+ AstTree *right = arguments[1];
+ AstTreeRawValue *ret = a404m_malloc(getSizeOfType(left->type));
+
+ switch (left->type->token) {
+ case AST_TREE_TOKEN_TYPE_I8:
+ *(i8 *)ret = *(i8 *)left->metadata << *(i8 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_U8:
+ *(u8 *)ret = *(u8 *)left->metadata << *(u8 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_I16:
+ *(i16 *)ret = *(i16 *)left->metadata << *(i16 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_U16:
+ *(u16 *)ret = *(u16 *)left->metadata << *(u16 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_I32:
+ *(i32 *)ret = *(i32 *)left->metadata << *(i32 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_U32:
+ *(u32 *)ret = *(u32 *)left->metadata << *(u32 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_I64:
+ *(i64 *)ret = *(i64 *)left->metadata << *(i64 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_U64:
+ *(u64 *)ret = *(u64 *)left->metadata << *(u64 *)right->metadata;
+ break;
+ default:
+ UNREACHABLE;
+ }
+ return newAstTree(AST_TREE_TOKEN_RAW_VALUE, ret, copyAstTree(left->type),
+ NULL, NULL);
+ }
+ case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT: {
+ AstTree *left = arguments[0];
+ AstTree *right = arguments[1];
+ AstTreeRawValue *ret = a404m_malloc(getSizeOfType(left->type));
+
+ switch (left->type->token) {
+ case AST_TREE_TOKEN_TYPE_I8:
+ *(i8 *)ret = *(i8 *)left->metadata >> *(i8 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_U8:
+ *(u8 *)ret = *(u8 *)left->metadata >> *(u8 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_I16:
+ *(i16 *)ret = *(i16 *)left->metadata >> *(i16 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_U16:
+ *(u16 *)ret = *(u16 *)left->metadata >> *(u16 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_I32:
+ *(i32 *)ret = *(i32 *)left->metadata >> *(i32 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_U32:
+ *(u32 *)ret = *(u32 *)left->metadata >> *(u32 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_I64:
+ *(i64 *)ret = *(i64 *)left->metadata >> *(i64 *)right->metadata;
+ break;
+ case AST_TREE_TOKEN_TYPE_U64:
+ *(u64 *)ret = *(u64 *)left->metadata >> *(u64 *)right->metadata;
+ break;
+ default:
+ UNREACHABLE;
+ }
+ return newAstTree(AST_TREE_TOKEN_RAW_VALUE, ret, copyAstTree(left->type),
+ NULL, NULL);
+ }
case AST_TREE_TOKEN_BUILTIN_PUTC: {
putchar(*(u8 *)arguments[0]->metadata);
return copyAstTree(&AST_TREE_VOID_VALUE);
@@ -1447,7 +1519,9 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR:
case AST_TREE_TOKEN_OPERATOR_BITWISE_AND:
case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR:
- case AST_TREE_TOKEN_OPERATOR_BITWISE_OR: {
+ case AST_TREE_TOKEN_OPERATOR_BITWISE_OR:
+ case AST_TREE_TOKEN_OPERATOR_SHIFT_LEFT:
+ case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT: {
AstTreeInfix *metadata = expr->metadata;
AstTree *function =
runExpression(metadata->function->value, scope, shouldRet, false,
@@ -1541,6 +1615,8 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
case AST_TREE_TOKEN_BUILTIN_BITWISE_AND:
case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR:
case AST_TREE_TOKEN_BUILTIN_BITWISE_OR:
+ case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT:
+ case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT:
return copyAstTree(expr);
case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME: {
AstTreeBool *metadata = a404m_malloc(sizeof(*metadata));
@@ -2030,6 +2106,8 @@ AstTree *toRawValue(AstTree *value) {
case AST_TREE_TOKEN_BUILTIN_BITWISE_AND:
case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR:
case AST_TREE_TOKEN_BUILTIN_BITWISE_OR:
+ case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT:
+ case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT:
case AST_TREE_TOKEN_KEYWORD_RETURN:
case AST_TREE_TOKEN_KEYWORD_BREAK:
case AST_TREE_TOKEN_KEYWORD_CONTINUE:
@@ -2068,6 +2146,8 @@ AstTree *toRawValue(AstTree *value) {
case AST_TREE_TOKEN_OPERATOR_BITWISE_AND:
case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR:
case AST_TREE_TOKEN_OPERATOR_BITWISE_OR:
+ case AST_TREE_TOKEN_OPERATOR_SHIFT_LEFT:
+ case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT:
case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS:
case AST_TREE_TOKEN_SCOPE:
case AST_TREE_TOKEN_NONE:
@@ -2205,6 +2285,8 @@ AstTree *castTo(AstTree *tree, AstTree *to) {
case AST_TREE_TOKEN_BUILTIN_BITWISE_AND:
case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR:
case AST_TREE_TOKEN_BUILTIN_BITWISE_OR:
+ case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT:
+ case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT:
case AST_TREE_TOKEN_KEYWORD_RETURN:
case AST_TREE_TOKEN_KEYWORD_BREAK:
case AST_TREE_TOKEN_KEYWORD_CONTINUE:
@@ -2253,6 +2335,8 @@ AstTree *castTo(AstTree *tree, AstTree *to) {
case AST_TREE_TOKEN_OPERATOR_BITWISE_AND:
case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR:
case AST_TREE_TOKEN_OPERATOR_BITWISE_OR:
+ case AST_TREE_TOKEN_OPERATOR_SHIFT_LEFT:
+ case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT:
case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS:
case AST_TREE_TOKEN_SCOPE:
case AST_TREE_TOKEN_NONE:
@@ -2331,6 +2415,8 @@ ffi_type *toFFIType(AstTree *type) {
case AST_TREE_TOKEN_BUILTIN_BITWISE_AND:
case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR:
case AST_TREE_TOKEN_BUILTIN_BITWISE_OR:
+ case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT:
+ case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT:
case AST_TREE_TOKEN_KEYWORD_RETURN:
case AST_TREE_TOKEN_KEYWORD_BREAK:
case AST_TREE_TOKEN_KEYWORD_CONTINUE:
@@ -2379,6 +2465,8 @@ ffi_type *toFFIType(AstTree *type) {
case AST_TREE_TOKEN_OPERATOR_BITWISE_AND:
case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR:
case AST_TREE_TOKEN_OPERATOR_BITWISE_OR:
+ case AST_TREE_TOKEN_OPERATOR_SHIFT_LEFT:
+ case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT:
case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS:
case AST_TREE_TOKEN_SCOPE:
case AST_TREE_TOKEN_NONE: