summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile8
-rw-r--r--code/main.felan10
-rw-r--r--src/compiler/ast-tree.c52
-rw-r--r--src/compiler/ast-tree.h3
4 files changed, 47 insertions, 26 deletions
diff --git a/Makefile b/Makefile
index f7e5e58..3a5a9a6 100644
--- a/Makefile
+++ b/Makefile
@@ -19,9 +19,9 @@ NC := \033[0m
INC_DIRS := $(SRC_DIR)
INC_FLAGS := $(addprefix -I,$(INC_DIRS))
-# CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -O3
+CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -O3
# CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -Oz
-CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -g
+# CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -g
EXEC_FILE := $(BUILD_DIR)/$(PROJECT_NAME)
@@ -66,10 +66,10 @@ test-all: $(EXEC_FILE) test/big.felan
test/big.felan: Makefile
mkdir -p test
echo "main :: () -> void {" > $@
- for((n = 0;n < 100000;n++)); do echo " print(1);" >> $@; done
+ for((n = 0;n < 100000;n++)); do echo " print('1');" >> $@; done
echo "};" >> $@
echo "print :: (value:u8) -> void {" >> $@
- echo " putc '0'+value;" >> $@
+ echo " putc value;" >> $@
echo "};" >> $@
# $@ = left hand of :
diff --git a/code/main.felan b/code/main.felan
index 47de67d..583c05d 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -17,9 +17,19 @@ long_double :: f128;
usize :: u64;
+t :: f(7);
+
+f :: (a:i64)->i64{
+ if a == 0 || a == 1
+ return 0;
+ else
+ return f(a-1)+f(a-2);
+};
+
main :: () -> void {
a :i64 = 12;
b :u64 = 34;
+ print_rev(t);
print_rev(a);
print_rev(b);
print_rev();
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index cb1fa03..4956ec0 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -1361,7 +1361,7 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) {
}
}
- if (!setAllTypesRoot(root, &helper)) {
+ if (!setAllTypesRoot(root)) {
goto RETURN_ERROR;
}
@@ -2998,10 +2998,9 @@ AstTree *getValue(AstTree *tree) {
UNREACHABLE;
}
-bool setAllTypesRoot(AstTreeRoot *root, AstTreeHelper *helper) {
+bool setAllTypesRoot(AstTreeRoot *root) {
AstTreeSetTypesHelper setTypesHelper = {
.lookingType = NULL,
- .treeHelper = helper,
.dependencies =
{
.data = NULL,
@@ -3331,14 +3330,31 @@ bool setTypesFunction(AstTree *tree, AstTreeSetTypesHelper helper) {
tree->type = makeTypeOf(tree);
- for (size_t i = 0; i < metadata->scope.expressions_size; ++i) {
- if (!setAllTypes(metadata->scope.expressions[i], helper, metadata, NULL)) {
- return false;
+ AstTreeVariable *deps[helper.dependencies.size];
+ size_t deps_size = 0;
+ for (size_t i = 0; i < helper.dependencies.size; ++i) {
+ AstTreeVariable *var = helper.dependencies.data[i];
+ if (var->value == tree) {
+ continue;
}
+ deps[deps_size] = helper.dependencies.data[i];
+ deps_size += 1;
}
+ AstTreeSetTypesHelper newHelper = {
+ .lookingType = NULL,
+ .dependencies.data = deps,
+ .dependencies.size = deps_size,
+ };
+
for (size_t i = 0; i < metadata->scope.variables.size; ++i) {
- if (!setTypesAstVariable(metadata->scope.variables.data[i], helper)) {
+ if (!setTypesAstVariable(metadata->scope.variables.data[i], newHelper)) {
+ return false;
+ }
+ }
+
+ for (size_t i = 0; i < metadata->scope.expressions_size; ++i) {
+ if (!setAllTypes(metadata->scope.expressions[i], newHelper, metadata, NULL)) {
return false;
}
}
@@ -3350,7 +3366,6 @@ bool setTypesPrintU64(AstTree *tree, AstTreeSetTypesHelper _helper) {
AstTreeSingleChild *metadata = tree->metadata;
AstTreeSetTypesHelper helper = {
.lookingType = &AST_TREE_U8_TYPE,
- .treeHelper = _helper.treeHelper,
.dependencies = _helper.dependencies,
};
if (!setAllTypes(metadata, helper, NULL, NULL)) {
@@ -3374,7 +3389,6 @@ bool setTypesReturn(AstTree *tree, AstTreeSetTypesHelper _helper,
if (metadata->value != NULL) {
AstTreeSetTypesHelper helper = {
.lookingType = getValue(function->returnType),
- .treeHelper = _helper.treeHelper,
.dependencies = _helper.dependencies,
};
if (helper.lookingType == NULL) {
@@ -3424,7 +3438,6 @@ bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper _helper) {
AstTreeSetTypesHelper helper = {
.lookingType = NULL,
- .treeHelper = _helper.treeHelper,
.dependencies = _helper.dependencies,
};
@@ -3716,7 +3729,6 @@ bool setTypesOperatorInfixWithRetAndLooking(AstTree *tree, AstTree *lookingType,
AstTreeSetTypesHelper _helper) {
AstTreeSetTypesHelper helper = {
.lookingType = lookingType,
- .treeHelper = _helper.treeHelper,
.dependencies = _helper.dependencies,
};
AstTreeInfix *infix = tree->metadata;
@@ -3746,7 +3758,6 @@ bool setTypesOperatorUnaryWithRetAndLooking(AstTree *tree, AstTree *lookingType,
AstTreeSetTypesHelper _helper) {
AstTreeSetTypesHelper helper = {
.lookingType = lookingType,
- .treeHelper = _helper.treeHelper,
.dependencies = _helper.dependencies,
};
AstTreeSingleChild *operand = tree->metadata;
@@ -3828,7 +3839,6 @@ bool setTypesAstVariable(AstTreeVariable *variable,
AstTreeSetTypesHelper helper = {
.lookingType = &AST_TREE_TYPE_TYPE,
- .treeHelper = _helper.treeHelper,
.dependencies =
{
.data = deps,
@@ -4118,15 +4128,17 @@ bool setTypesBuiltin(AstTree *tree, AstTreeSetTypesHelper helper,
UNREACHABLE;
}
-bool setTypesAstInfix(AstTreeInfix *infix, AstTreeSetTypesHelper helper) {
+bool setTypesAstInfix(AstTreeInfix *infix, AstTreeSetTypesHelper _helper) {
+ AstTreeSetTypesHelper helper = {
+ .lookingType = NULL,
+ .dependencies = _helper.dependencies,
+ };
+
if (!setAllTypes(&infix->left, helper, NULL, NULL)) {
return false;
}
- AstTreeSetTypesHelper newHelper = {
- .lookingType = infix->left.type,
- .treeHelper = helper.treeHelper,
- .dependencies = helper.dependencies,
- };
- return setAllTypes(&infix->right, newHelper, NULL, NULL);
+ helper.lookingType = infix->left.type;
+
+ return setAllTypes(&infix->right, helper, NULL, NULL);
}
diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h
index 85bd44e..e03405e 100644
--- a/src/compiler/ast-tree.h
+++ b/src/compiler/ast-tree.h
@@ -214,7 +214,6 @@ typedef struct AstTreeHelper {
typedef struct AstTreeSetTypesHelper {
AstTree *lookingType;
- AstTreeHelper *treeHelper;
AstTreeVariables dependencies;
} AstTreeSetTypesHelper;
@@ -316,7 +315,7 @@ bool typeIsEqual(AstTree *type0, AstTree *type1);
bool typeIsEqualBack(const AstTree *type0, const AstTree *type1);
AstTree *getValue(AstTree *tree);
-bool setAllTypesRoot(AstTreeRoot *root, AstTreeHelper *helper);
+bool setAllTypesRoot(AstTreeRoot *root);
bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper,
AstTreeFunction *function, AstTreeFunctionCall *functionCall);
bool setTypesValueBool(AstTree *tree, AstTreeSetTypesHelper helper);