aboutsummaryrefslogtreecommitdiff
path: root/src/runner/runner.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-06-05 07:50:03 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-06-05 07:50:03 +0330
commit3a079c1da7508839088c0c70795819692954eb43 (patch)
tree4bfd0d3dc27e4445d238e080b316c9db07252de7 /src/runner/runner.c
parent18d3c17a36fa7b330c996a781aff957cbdaee698 (diff)
fix some bugs
Diffstat (limited to 'src/runner/runner.c')
-rw-r--r--src/runner/runner.c176
1 files changed, 160 insertions, 16 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c
index 984c7d6..e6dc2b8 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -338,13 +338,13 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope,
*(f128 *)ret = *(f128 *)left->metadata + *(f128 *)right->metadata;
break;
case AST_TREE_TOKEN_OPERATOR_POINTER:
- if (typeIsEqual(right->type, &AST_TREE_I64_TYPE)) {
+ if (typeIsEqual(right->type, &AST_TREE_I64_TYPE, scope)) {
*(u8 **)ret =
*(u8 **)left->metadata +
*(i64 *)right->metadata *
getSizeOfType((AstTreeSingleChild *)left->type->metadata);
break;
- } else if (typeIsEqual(right->type, &AST_TREE_U64_TYPE)) {
+ } else if (typeIsEqual(right->type, &AST_TREE_U64_TYPE, scope)) {
*(u8 **)ret =
*(u8 **)left->metadata +
*(u64 *)right->metadata *
@@ -405,13 +405,13 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope,
*(f128 *)ret = *(f128 *)left->metadata - *(f128 *)right->metadata;
break;
case AST_TREE_TOKEN_OPERATOR_POINTER:
- if (typeIsEqual(right->type, &AST_TREE_I64_TYPE)) {
+ if (typeIsEqual(right->type, &AST_TREE_I64_TYPE, scope)) {
*(u8 **)ret =
*(u8 **)left->metadata -
*(i64 *)right->metadata *
getSizeOfType((AstTreeSingleChild *)left->type->metadata);
break;
- } else if (typeIsEqual(right->type, &AST_TREE_U64_TYPE)) {
+ } else if (typeIsEqual(right->type, &AST_TREE_U64_TYPE, scope)) {
*(u8 **)ret =
*(u8 **)left->metadata -
*(u64 *)right->metadata *
@@ -627,7 +627,7 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope,
*(AstTreeBool *)left->metadata == *(AstTreeBool *)right->metadata;
break;
case AST_TREE_TOKEN_TYPE_TYPE:
- *(AstTreeBool *)ret->metadata = typeIsEqual(left, right);
+ *(AstTreeBool *)ret->metadata = typeIsEqual(left, right, scope);
break;
default:
printLog("%s", AST_TREE_TOKEN_STRINGS[left->token]);
@@ -699,7 +699,7 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope,
*(AstTreeBool *)left->metadata == *(AstTreeBool *)right->metadata;
break;
case AST_TREE_TOKEN_TYPE_TYPE:
- *(AstTreeBool *)ret->metadata = !typeIsEqual(left, right);
+ *(AstTreeBool *)ret->metadata = !typeIsEqual(left, right, scope);
break;
default:
UNREACHABLE;
@@ -1247,7 +1247,7 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope,
}
AstTree *runAstTreeCFunction(AstTree *tree, AstTree **arguments,
- size_t arguments_size) {
+ size_t arguments_size, AstTreeScope *scope) {
AstTreeCFunction *metadata = tree->metadata;
AstTreeCLibrary *lib = metadata->library->metadata;
char *name = u8ArrayToCString(metadata->name);
@@ -1269,7 +1269,7 @@ AstTree *runAstTreeCFunction(AstTree *tree, AstTree **arguments,
for (size_t i = 0; i < arguments_size; ++i) {
AstTreeTypeFunctionArgument arg = funcType->arguments[i];
args[i] = toFFIType(arg.type);
- if (!typeIsEqual(arg.type, arguments[i]->type)) {
+ if (!typeIsEqual(arg.type, arguments[i]->type, scope)) {
printLog("%s %s", AST_TREE_TOKEN_STRINGS[arg.type->token],
AST_TREE_TOKEN_STRINGS[arguments[i]->type->token]);
UNREACHABLE;
@@ -1291,7 +1291,7 @@ AstTree *runAstTreeCFunction(AstTree *tree, AstTree **arguments,
}
deleteFFIType(retType);
- if (typeIsEqual(funcType->returnType, &AST_TREE_VOID_TYPE)) {
+ if (typeIsEqual(funcType->returnType, &AST_TREE_VOID_TYPE, scope)) {
return &AST_TREE_VOID_TYPE;
} else {
const size_t size = getSizeOfType(funcType->returnType);
@@ -1405,7 +1405,7 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
return args[i];
}
}
- result = runAstTreeCFunction(function, args, args_size);
+ result = runAstTreeCFunction(function, args, args_size, scope);
for (size_t i = 0; i < args_size; ++i) {
astTreeDelete(args[i]);
}
@@ -1894,13 +1894,9 @@ AstTree *toRawValue(AstTree *value, AstTreeScope *scope) {
size_t size;
AstTreeRawValue *rawValue;
if (value->type->token == AST_TREE_TOKEN_TYPE_ARRAY) {
- struct Array {
- void *data;
- size_t size;
- };
- size = sizeof(struct Array);
+ size = sizeof(ArrayValueStruct);
rawValue = a404m_malloc(size);
- struct Array *array = (struct Array *)rawValue;
+ ArrayValueStruct *array = (ArrayValueStruct *)rawValue;
AstTreeBracket *bracket = value->type->metadata;
@@ -2115,6 +2111,154 @@ AstTree *toRawValue(AstTree *value, AstTreeScope *scope) {
return NULL;
}
+AstTree *fromRawValue(AstTree *value) {
+ if (value->token != AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED &&
+ value->token != AST_TREE_TOKEN_RAW_VALUE) {
+ return NULL;
+ }
+ switch (value->type->token) {
+ case AST_TREE_TOKEN_TYPE_ARRAY: {
+ AstTreeBracket *arrayType = value->type->metadata;
+ AstTree *itemType = arrayType->operand;
+ size_t itemTypeSize = getSizeOfType(itemType);
+
+ AstTreeObject *resultObject = a404m_malloc(sizeof(*resultObject));
+
+ ArrayValueStruct *arrayValue = value->metadata;
+ resultObject->items_size = arrayValue->size;
+
+ resultObject->items =
+ a404m_malloc(resultObject->items_size * sizeof(*resultObject->items));
+
+ for (size_t i = 0; i < arrayValue->size; ++i) {
+ AstTree *raw = newAstTree(AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED,
+ (u8 *)arrayValue->data + i * itemTypeSize,
+ copyAstTree(itemType), NULL, NULL);
+ AstTree *v = fromRawValue(raw);
+ if (v != NULL) {
+ astTreeDelete(v);
+ raw = v;
+ }
+ resultObject->items[i].value = raw;
+ }
+
+ return newAstTree(AST_TREE_TOKEN_VALUE_OBJECT, resultObject,
+ copyAstTree(value->type), value->str_begin,
+ value->str_end);
+ }
+ case AST_TREE_TOKEN_TYPE_I8:
+ case AST_TREE_TOKEN_TYPE_U8:
+ case AST_TREE_TOKEN_TYPE_I16:
+ case AST_TREE_TOKEN_TYPE_U16:
+ case AST_TREE_TOKEN_TYPE_I32:
+ case AST_TREE_TOKEN_TYPE_U32:
+ case AST_TREE_TOKEN_TYPE_I64:
+ case AST_TREE_TOKEN_TYPE_U64:
+ case AST_TREE_TOKEN_TYPE_F16:
+ case AST_TREE_TOKEN_TYPE_F32:
+ case AST_TREE_TOKEN_TYPE_F64:
+ case AST_TREE_TOKEN_TYPE_F128:
+ case AST_TREE_TOKEN_TYPE_CODE:
+ case AST_TREE_TOKEN_TYPE_NAMESPACE:
+ case AST_TREE_TOKEN_TYPE_SHAPE_SHIFTER:
+ case AST_TREE_TOKEN_TYPE_C_LIBRARY:
+ case AST_TREE_TOKEN_TYPE_C_FUNCTION:
+ case AST_TREE_TOKEN_TYPE_BOOL:
+ case AST_TREE_TOKEN_TYPE_FUNCTION:
+ case AST_TREE_TOKEN_TYPE_TYPE:
+ case AST_TREE_TOKEN_TYPE_ANY_TYPE:
+ case AST_TREE_TOKEN_TYPE_VOID:
+ case AST_TREE_TOKEN_FUNCTION:
+ case AST_TREE_TOKEN_BUILTIN_CAST:
+ case AST_TREE_TOKEN_BUILTIN_TYPE_OF:
+ case AST_TREE_TOKEN_BUILTIN_SIZE_OF:
+ case AST_TREE_TOKEN_BUILTIN_IMPORT:
+ case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME:
+ case AST_TREE_TOKEN_BUILTIN_STACK_ALLOC:
+ case AST_TREE_TOKEN_BUILTIN_HEAP_ALLOC:
+ case AST_TREE_TOKEN_BUILTIN_NEG:
+ case AST_TREE_TOKEN_BUILTIN_ADD:
+ case AST_TREE_TOKEN_BUILTIN_SUB:
+ case AST_TREE_TOKEN_BUILTIN_MUL:
+ case AST_TREE_TOKEN_BUILTIN_DIV:
+ case AST_TREE_TOKEN_BUILTIN_MOD:
+ case AST_TREE_TOKEN_BUILTIN_EQUAL:
+ case AST_TREE_TOKEN_BUILTIN_NOT_EQUAL:
+ case AST_TREE_TOKEN_BUILTIN_GREATER:
+ case AST_TREE_TOKEN_BUILTIN_SMALLER:
+ case AST_TREE_TOKEN_BUILTIN_GREATER_OR_EQUAL:
+ case AST_TREE_TOKEN_BUILTIN_SMALLER_OR_EQUAL:
+ case AST_TREE_TOKEN_BUILTIN_PUTC:
+ case AST_TREE_TOKEN_BUILTIN_C_LIBRARY:
+ case AST_TREE_TOKEN_BUILTIN_C_FUNCTION:
+ case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT:
+ 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_BUILTIN_INSERT:
+ case AST_TREE_TOKEN_KEYWORD_RETURN:
+ case AST_TREE_TOKEN_KEYWORD_BREAK:
+ case AST_TREE_TOKEN_KEYWORD_CONTINUE:
+ case AST_TREE_TOKEN_KEYWORD_IF:
+ case AST_TREE_TOKEN_KEYWORD_WHILE:
+ case AST_TREE_TOKEN_KEYWORD_COMPTIME:
+ case AST_TREE_TOKEN_KEYWORD_STRUCT:
+ case AST_TREE_TOKEN_VALUE_VOID:
+ case AST_TREE_TOKEN_FUNCTION_CALL:
+ case AST_TREE_TOKEN_VARIABLE:
+ case AST_TREE_TOKEN_VARIABLE_DEFINE:
+ case AST_TREE_TOKEN_VALUE_NULL:
+ case AST_TREE_TOKEN_VALUE_UNDEFINED:
+ case AST_TREE_TOKEN_VALUE_NAMESPACE:
+ case AST_TREE_TOKEN_VALUE_SHAPE_SHIFTER:
+ case AST_TREE_TOKEN_VALUE_C_LIBRARY:
+ case AST_TREE_TOKEN_VALUE_C_FUNCTION:
+ case AST_TREE_TOKEN_VALUE_INT:
+ case AST_TREE_TOKEN_VALUE_FLOAT:
+ case AST_TREE_TOKEN_VALUE_BOOL:
+ case AST_TREE_TOKEN_VALUE_OBJECT:
+ case AST_TREE_TOKEN_RAW_VALUE:
+ case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED:
+ case AST_TREE_TOKEN_SHAPE_SHIFTER_ELEMENT:
+ case AST_TREE_TOKEN_OPERATOR_ASSIGN:
+ case AST_TREE_TOKEN_OPERATOR_PLUS:
+ case AST_TREE_TOKEN_OPERATOR_MINUS:
+ case AST_TREE_TOKEN_OPERATOR_SUM:
+ case AST_TREE_TOKEN_OPERATOR_SUB:
+ case AST_TREE_TOKEN_OPERATOR_MULTIPLY:
+ case AST_TREE_TOKEN_OPERATOR_DIVIDE:
+ case AST_TREE_TOKEN_OPERATOR_MODULO:
+ case AST_TREE_TOKEN_OPERATOR_EQUAL:
+ case AST_TREE_TOKEN_OPERATOR_NOT_EQUAL:
+ case AST_TREE_TOKEN_OPERATOR_GREATER:
+ case AST_TREE_TOKEN_OPERATOR_SMALLER:
+ case AST_TREE_TOKEN_OPERATOR_GREATER_OR_EQUAL:
+ case AST_TREE_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
+ case AST_TREE_TOKEN_OPERATOR_POINTER:
+ case AST_TREE_TOKEN_OPERATOR_ADDRESS:
+ case AST_TREE_TOKEN_OPERATOR_DEREFERENCE:
+ case AST_TREE_TOKEN_OPERATOR_ACCESS:
+ case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT:
+ case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND:
+ case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR:
+ case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS:
+ case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS_ASSIGN:
+ case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS_ADDRESS:
+ case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT:
+ 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_SCOPE:
+ return NULL;
+ case AST_TREE_TOKEN_NONE:
+ }
+ UNREACHABLE;
+}
+
AstTree *castTo(AstTree *tree, AstTree *to) {
switch (tree->type->token) {
case AST_TREE_TOKEN_TYPE_VOID: {