aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--code/lib/memory.felan4
-rw-r--r--code/lib/vector.felan16
-rw-r--r--code/main.felan4
-rw-r--r--src/compiler/ast-tree.c16
4 files changed, 30 insertions, 10 deletions
diff --git a/code/lib/memory.felan b/code/lib/memory.felan
index 7715d0e..55451c5 100644
--- a/code/lib/memory.felan
+++ b/code/lib/memory.felan
@@ -8,6 +8,6 @@ malloc :: (size:i64,comptime t:type) -> (*t) {
return @cast(malloc(size*@cast(@size_of(t),i64)),*t);
};
-free :: (a:*anytype) -> void {
- free(@cast(a,*void));
+free :: (ptr:*anytype) -> void {
+ free(@cast(ptr,*void));
};
diff --git a/code/lib/vector.felan b/code/lib/vector.felan
index 6ad1991..a33d386 100644
--- a/code/lib/vector.felan
+++ b/code/lib/vector.felan
@@ -17,6 +17,22 @@ vector_new :: (comptime t:type) -> (vector(t)) {
return v;
};
+__get_item__ :: (left:vector(anytype),index:i64) -> (@type_of(left.ptr.*)) {
+ return (left.ptr + index).*;
+};
+
+__set_item__ :: (left:vector(anytype),index:i64,item:@type_of(left.ptr.*)) -> (@type_of(left.ptr.*)) {
+ return (left.ptr + index).* = item;
+};
+
+__get_item_address__ :: (left:vector(anytype),index:i64) -> (@type_of(left.ptr)) {
+ return (left.ptr + index);
+};
+
+push_back :: (vec:vector(anytype),value:@type_of(vec.ptr.*)) -> void {
+ @putc('h');
+};
+
delete :: (vec:vector(anytype)) -> void {
free(vec.ptr);
};
diff --git a/code/main.felan b/code/main.felan
index b297e3f..20c815a 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -1,6 +1,5 @@
// @import("basic.felan");
@import("lib/vector.felan");
-// @import("lib/memory.felan");
/*
t :: (comptime formatter : string) macro -> void {
@@ -30,6 +29,9 @@ t :: (comptime formatter : string) macro -> void {
main :: () -> void {
v := vector_new(u8);
+
+ push_back(v,2u8);
+
delete(v);
};
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index ca79136..416e6fc 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -3906,6 +3906,9 @@ bool hasAnyTypeInside(AstTree *type) {
}
return false;
}
+ 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_FUNCTION_CALL: {
AstTreeFunctionCall *metadata = type->metadata;
for (size_t i = 0; i < metadata->parameters.size; ++i) {
@@ -3916,6 +3919,8 @@ bool hasAnyTypeInside(AstTree *type) {
return false;
}
case AST_TREE_TOKEN_VARIABLE:
+ case AST_TREE_TOKEN_OPERATOR_ADDRESS:
+ case AST_TREE_TOKEN_OPERATOR_DEREFERENCE:
return false;
case AST_TREE_TOKEN_FUNCTION:
case AST_TREE_TOKEN_KEYWORD_RETURN:
@@ -3944,15 +3949,10 @@ bool hasAnyTypeInside(AstTree *type) {
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_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:
@@ -8215,8 +8215,6 @@ AstTree *getShapeShifterElement(AstTreeFunctionCall *metadata,
AstTreeFunction *newFunction =
copyAstTreeFunction(shapeShifter->function, NULL, NULL, 0, true);
- newFunction->isMacro = shapeShifter->function->isMacro;
-
AstTreeFunctionCallParam initedArguments[newFunction->arguments.size];
size_t initedArguments_size = newFunction->arguments.size;
@@ -8531,6 +8529,8 @@ bool doesShapeShifterMatch(AstTreeShapeShifter *shapeShifter,
goto RETURN_FALSE;
}
arg->value = copyAstTree(param.value);
+ astTreeDelete(arg->type);
+ arg->type = copyAstTree(param.value->type);
initedArguments[j] = param;
goto END_OF_NAMED_FOR1;
} else {
@@ -8560,6 +8560,8 @@ bool doesShapeShifterMatch(AstTreeShapeShifter *shapeShifter,
goto RETURN_FALSE;
}
arg->value = copyAstTree(param.value);
+ astTreeDelete(arg->type);
+ arg->type = copyAstTree(param.value->type);
initedArguments[j] = param;
goto END_OF_UNNAMED_FOR1;
}