summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-04-10 07:36:02 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-04-10 07:36:02 +0330
commit3a4f7672a416a29fe528c01321858beea9781f47 (patch)
treee5825a55f7321616f7563ba059c22d5166af725b
parent5e95fdfa4b7e6960d83480b8e4062e7484037af7 (diff)
fix bug in builtin
-rw-r--r--code/main.felan6
-rw-r--r--src/compiler/ast-tree.c164
2 files changed, 94 insertions, 76 deletions
diff --git a/code/main.felan b/code/main.felan
index 1d50f0b..e69dc7c 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -19,7 +19,11 @@ usize :: u64;
main :: () -> void {
- print_u64_rev(1234);
+ a:u64 = 97;
+ b := @cast(a,u16);
+ putc @cast(a,u8);
+ putc @cast(b,u8);
+ // print_u64_rev(1234);
};
print_u64_rev :: (value:u64) -> void {
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 0d70822..0d52265 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -4060,88 +4060,102 @@ bool setTypesOperatorAccess(AstTree *tree, AstTreeSetTypesHelper helper) {
bool setTypesBuiltin(AstTree *tree, AstTreeSetTypesHelper helper,
AstTreeFunctionCall *functionCall) {
- if (functionCall->parameters_size != 2) {
- return false;
- }
- AstTreeTypeFunction *type_metadata = a404m_malloc(sizeof(*type_metadata));
- type_metadata->arguments_size = 2;
- type_metadata->arguments = a404m_malloc(type_metadata->arguments_size *
- sizeof(*type_metadata->arguments));
-
- AstTree *from = NULL;
- AstTree *to = NULL;
-
- static char FROM_STR[] = "from";
- static const size_t FROM_STR_SIZE =
- sizeof(FROM_STR) / sizeof(*FROM_STR) - sizeof(*FROM_STR);
- static char TO_STR[] = "to";
- static const size_t TO_STR_SIZE =
- sizeof(TO_STR) / sizeof(*TO_STR) - sizeof(*TO_STR);
-
- for (size_t i = 0; i < functionCall->parameters_size; ++i) {
- AstTreeFunctionCallParam param = functionCall->parameters[i];
- const size_t param_name_size = param.nameEnd - param.nameBegin;
-
- if (param_name_size == 0) {
- if (from == NULL) {
- from = param.value;
- } else if (to == NULL) {
- to = param.value;
- } else {
- printError(param.value->str_begin, param.value->str_end,
- "Bad paramter");
+ AstTreeBuiltin *metadata = tree->metadata;
+
+ switch (metadata->token) {
+ case AST_TREE_BUILTIN_TOKEN_CAST: {
+ if (functionCall->parameters_size == 2) {
+ AstTree *from = NULL;
+ AstTree *to = NULL;
+
+ static char FROM_STR[] = "from";
+ static const size_t FROM_STR_SIZE =
+ sizeof(FROM_STR) / sizeof(*FROM_STR) - sizeof(*FROM_STR);
+ static char TO_STR[] = "to";
+ static const size_t TO_STR_SIZE =
+ sizeof(TO_STR) / sizeof(*TO_STR) - sizeof(*TO_STR);
+
+ for (size_t i = 0; i < functionCall->parameters_size; ++i) {
+ AstTreeFunctionCallParam param = functionCall->parameters[i];
+ const size_t param_name_size = param.nameEnd - param.nameBegin;
+
+ if (param_name_size == 0) {
+ if (from == NULL) {
+ from = param.value;
+ } else if (to == NULL) {
+ to = param.value;
+ } else {
+ printError(param.value->str_begin, param.value->str_end,
+ "Bad paramter");
+ return false;
+ }
+ } else if (param_name_size == FROM_STR_SIZE &&
+ strncmp(param.nameBegin, FROM_STR, FROM_STR_SIZE) == 0 &&
+ from == NULL) {
+ from = param.value;
+ } else if (param_name_size == TO_STR_SIZE &&
+ strncmp(param.nameBegin, TO_STR, TO_STR_SIZE) == 0 &&
+ to == NULL) {
+ to = param.value;
+ } else {
+ printError(param.value->str_begin, param.value->str_end,
+ "Bad paramter");
+ return false;
+ }
+ }
+
+ if (from == NULL || to == NULL ||
+ !setAllTypes(from,
+ (AstTreeSetTypesHelper){
+ .lookingType = NULL,
+ .treeHelper = helper.treeHelper,
+ },
+ NULL, NULL) ||
+ !setAllTypes(to,
+ (AstTreeSetTypesHelper){
+ .lookingType = NULL,
+ .treeHelper = helper.treeHelper,
+ },
+ NULL, NULL)) {
return false;
}
- } else if (param_name_size == FROM_STR_SIZE &&
- strncmp(param.nameBegin, FROM_STR, FROM_STR_SIZE) == 0 &&
- from == NULL) {
- from = param.value;
- } else if (param_name_size == TO_STR_SIZE &&
- strncmp(param.nameBegin, TO_STR, TO_STR_SIZE) == 0 &&
- to == NULL) {
- to = param.value;
+
+ AstTreeTypeFunction *type_metadata = a404m_malloc(sizeof(*type_metadata));
+ type_metadata->arguments_size = 2;
+ type_metadata->arguments = a404m_malloc(
+ type_metadata->arguments_size * sizeof(*type_metadata->arguments));
+
+ type_metadata->returnType = copyAstTree(to);
+
+ type_metadata->arguments[0] = (AstTreeTypeFunctionArgument){
+ .type = copyAstTree(from->type),
+ .name_begin = FROM_STR,
+ .name_end = FROM_STR + FROM_STR_SIZE,
+ .str_begin = NULL,
+ .str_end = NULL,
+ };
+
+ type_metadata->arguments[1] = (AstTreeTypeFunctionArgument){
+ .type = copyAstTree(to->type),
+ .name_begin = TO_STR,
+ .name_end = TO_STR + TO_STR_SIZE,
+ .str_begin = NULL,
+ .str_end = NULL,
+ };
+
+ tree->type = newAstTree(AST_TREE_TOKEN_TYPE_FUNCTION, type_metadata,
+ &AST_TREE_TYPE_TYPE, NULL, NULL);
+ return true;
} else {
- printError(param.value->str_begin, param.value->str_end, "Bad paramter");
+ printError(tree->str_begin, tree->str_end,
+ "Too many or too few arguments");
return false;
}
- }
-
- if (!setAllTypes(from,
- (AstTreeSetTypesHelper){
- .lookingType = NULL,
- .treeHelper = helper.treeHelper,
- },
- NULL, NULL) ||
- !setAllTypes(to,
- (AstTreeSetTypesHelper){
- .lookingType = NULL,
- .treeHelper = helper.treeHelper,
- },
- NULL, NULL)) {
return false;
}
-
- type_metadata->returnType = copyAstTree(to);
-
- type_metadata->arguments[0] = (AstTreeTypeFunctionArgument){
- .type = copyAstTree(from->type),
- .name_begin = FROM_STR,
- .name_end = FROM_STR + FROM_STR_SIZE,
- .str_begin = NULL,
- .str_end = NULL,
- };
-
- type_metadata->arguments[1] = (AstTreeTypeFunctionArgument){
- .type = copyAstTree(to->type),
- .name_begin = TO_STR,
- .name_end = TO_STR + TO_STR_SIZE,
- .str_begin = NULL,
- .str_end = NULL,
- };
-
- tree->type = newAstTree(AST_TREE_TOKEN_TYPE_FUNCTION, type_metadata,
- &AST_TREE_TYPE_TYPE, NULL, NULL);
- return true;
+ case AST_TREE_BUILTIN_TOKEN__SIZE__:
+ }
+ UNREACHABLE;
}
bool setTypesAstInfix(AstTreeInfix *infix, AstTreeSetTypesHelper helper) {