aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--code/lib/memory.felan4
-rw-r--r--code/main.felan5
-rw-r--r--src/compiler/ast-tree.c33
3 files changed, 30 insertions, 12 deletions
diff --git a/code/lib/memory.felan b/code/lib/memory.felan
index adb9cf2..f1f9898 100644
--- a/code/lib/memory.felan
+++ b/code/lib/memory.felan
@@ -5,3 +5,7 @@ free :: @c_function(libc,"free",(*void)->void);
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));
+};
diff --git a/code/main.felan b/code/main.felan
index 5b0c634..b1a55b9 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -1,5 +1,5 @@
// @import("basic.felan");
-// @import("lib/memory.felan");
+@import("lib/memory.felan");
@import("lib/operator.felan");
print :: (value:**anytype)->void{
@@ -11,11 +11,12 @@ print :: (value:**anytype)->void{
};
main :: () -> void {
- a := @stack_alloc(10,u8);
+ a := malloc(10,u8);
a[0] = '1';
b := &a[2];
b.* = '9';
@putc(a[0]);
@putc(b.*);
+ free(a);
};
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 08c8091..0563086 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -7652,7 +7652,13 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin,
const char *name_end,
AstTreeSetTypesHelper helper,
AstTreeFunctionCall *functionCall) {
- AstTreeVariable *variable = NULL;
+ struct {
+ AstTreeVariable *var;
+ int op;
+ } variable = {
+ .var = NULL,
+ .op = 10,
+ };
const char *str = name_begin;
const size_t str_size = name_end - name_begin;
@@ -7672,7 +7678,8 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin,
return NULL;
}
- variable = var;
+ variable.var = var;
+ variable.op = 0;
break;
}
} else {
@@ -7750,13 +7757,17 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin,
goto CONTINUE_OUTER;
}
}
- if (variable != NULL) {
+ if (variable.var != NULL && variable.op == 0) {
printError(name_begin, name_end, "Multiple candidates found for %.*s",
(int)(name_end - name_begin), name_begin);
return NULL;
}
- variable = var;
+ variable.var = var;
+ variable.op = 0;
} else if (var->type->token == AST_TREE_TOKEN_TYPE_SHAPE_SHIFTER) {
+ if (variable.op < 1) {
+ continue;
+ }
AstTreeShapeShifter *shapeShifter = var->value->metadata;
AstTreeFunction *function = shapeShifter->function;
@@ -7863,12 +7874,13 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin,
}
free(arguments.data);
- if (variable != NULL) {
+ if (variable.var != NULL) {
printError(name_begin, name_end, "Multiple candidates found for %.*s",
(int)(name_end - name_begin), name_begin);
return NULL;
}
- variable = var;
+ variable.var = var;
+ variable.op = 1;
continue;
CONTINUE_OUTER1:
for (size_t i = 0; i < arguments.size; ++i) {
@@ -7936,23 +7948,24 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin,
goto CONTINUE_OUTER;
}
}
- if (variable != NULL) {
+ if (variable.var != NULL && variable.op == 0) {
printError(name_begin, name_end, "Multiple candidates found for %.*s",
(int)(name_end - name_begin), name_begin);
return NULL;
}
- variable = var;
+ variable.var = var;
+ variable.op = 0;
}
CONTINUE_OUTER:
}
}
- if (variable == NULL) {
+ if (variable.var == NULL) {
printError(name_begin, name_end, "No candidates found for %.*s",
(int)(name_end - name_begin), name_begin);
return NULL;
}
- return variable;
+ return variable.var;
}
AstTree *getShapeShifterElement(AstTreeFunctionCall *metadata,