diff options
-rw-r--r-- | code/lib/memory.felan | 4 | ||||
-rw-r--r-- | code/main.felan | 5 | ||||
-rw-r--r-- | src/compiler/ast-tree.c | 33 |
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, |