diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-06-04 00:50:36 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-06-04 00:50:36 +0330 |
commit | a614d8973bf0eed2d12e49398fb34e234a77ccb3 (patch) | |
tree | 6e91f546c5ac09a361db197ad4a903732ce72e36 /src/compiler | |
parent | a6abc8734563ba8a1920c760dcb3c0147cb458b9 (diff) |
fix bug in pointer dereferencing
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/ast-tree.c | 24 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 1 |
2 files changed, 23 insertions, 2 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index ac6801d..b7212ad 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -265,6 +265,7 @@ const char *AST_TREE_TOKEN_STRINGS[] = { "AST_TREE_TOKEN_VALUE_BOOL", "AST_TREE_TOKEN_VALUE_OBJECT", "AST_TREE_TOKEN_RAW_VALUE", + "AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED", "AST_TREE_TOKEN_SHAPE_SHIFTER_ELEMENT", @@ -407,6 +408,7 @@ void astTreePrint(const AstTree *tree, int indent) { case AST_TREE_TOKEN_VALUE_NULL: case AST_TREE_TOKEN_VALUE_UNDEFINED: case AST_TREE_TOKEN_VARIABLE_DEFINE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: goto RETURN_SUCCESS; case AST_TREE_TOKEN_TYPE_C_FUNCTION: NOT_IMPLEMENTED; @@ -864,6 +866,7 @@ void astTreeDestroy(AstTree tree) { case AST_TREE_TOKEN_VALUE_UNDEFINED: case AST_TREE_TOKEN_VALUE_VOID: case AST_TREE_TOKEN_VARIABLE_DEFINE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: return; case AST_TREE_TOKEN_KEYWORD_BREAK: case AST_TREE_TOKEN_KEYWORD_CONTINUE: { @@ -1334,6 +1337,12 @@ AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[], variables_size, safetyCheck), tree->str_begin, tree->str_end); } + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: { + return newAstTree(tree->token, tree->metadata, + copyAstTreeBack(tree->type, oldVariables, newVariables, + variables_size, safetyCheck), + tree->str_begin, tree->str_end); + } case AST_TREE_TOKEN_VARIABLE: case AST_TREE_TOKEN_VARIABLE_DEFINE: { AstTreeVariable *variable = tree->metadata; @@ -3861,6 +3870,7 @@ bool hasAnyTypeInside(AstTree *type) { case AST_TREE_TOKEN_VALUE_BOOL: case AST_TREE_TOKEN_VALUE_OBJECT: case AST_TREE_TOKEN_RAW_VALUE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: return false; case AST_TREE_TOKEN_OPERATOR_POINTER: { AstTreeSingleChild *metadata = type->metadata; @@ -3989,6 +3999,7 @@ bool isConst(AstTree *tree) { case AST_TREE_TOKEN_VALUE_BOOL: case AST_TREE_TOKEN_VALUE_OBJECT: case AST_TREE_TOKEN_RAW_VALUE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: case AST_TREE_TOKEN_KEYWORD_COMPTIME: case AST_TREE_TOKEN_SCOPE: return true; @@ -4286,6 +4297,7 @@ AstTree *makeTypeOf(AstTree *value) { case AST_TREE_TOKEN_VALUE_C_LIBRARY: case AST_TREE_TOKEN_VALUE_C_FUNCTION: case AST_TREE_TOKEN_RAW_VALUE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: case AST_TREE_TOKEN_NONE: } UNREACHABLE; @@ -4383,6 +4395,7 @@ bool typeIsEqualBack(const AstTree *type0, const AstTree *type1) { case AST_TREE_TOKEN_VALUE_BOOL: case AST_TREE_TOKEN_VALUE_OBJECT: case AST_TREE_TOKEN_RAW_VALUE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: case AST_TREE_TOKEN_VARIABLE_DEFINE: case AST_TREE_TOKEN_OPERATOR_ASSIGN: case AST_TREE_TOKEN_OPERATOR_SUM: @@ -4597,6 +4610,7 @@ AstTree *getValue(AstTree *tree, bool copy) { case AST_TREE_TOKEN_VALUE_BOOL: case AST_TREE_TOKEN_VALUE_OBJECT: case AST_TREE_TOKEN_RAW_VALUE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: case AST_TREE_TOKEN_VARIABLE: case AST_TREE_TOKEN_FUNCTION_CALL: case AST_TREE_TOKEN_OPERATOR_ASSIGN: @@ -4655,7 +4669,7 @@ AstTree *getValue(AstTree *tree, bool copy) { }; AstTree *value = runExpression(tree, scope, &shouldRet, false, true, - &breakCount, &shouldContinue, false); + &breakCount, &shouldContinue); if (!copy) { astTreeDelete(tree); @@ -4768,6 +4782,7 @@ bool isIntType(AstTree *type) { case AST_TREE_TOKEN_VALUE_BOOL: case AST_TREE_TOKEN_VALUE_OBJECT: case AST_TREE_TOKEN_RAW_VALUE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: case AST_TREE_TOKEN_OPERATOR_ASSIGN: case AST_TREE_TOKEN_OPERATOR_PLUS: case AST_TREE_TOKEN_OPERATOR_MINUS: @@ -4886,6 +4901,7 @@ bool isFloatType(AstTree *type) { case AST_TREE_TOKEN_VALUE_BOOL: case AST_TREE_TOKEN_VALUE_OBJECT: case AST_TREE_TOKEN_RAW_VALUE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: case AST_TREE_TOKEN_OPERATOR_ASSIGN: case AST_TREE_TOKEN_OPERATOR_PLUS: case AST_TREE_TOKEN_OPERATOR_MINUS: @@ -4975,7 +4991,8 @@ bool isEqual(AstTree *left, AstTree *right) { AstTreeVariable *right_metadata = right->metadata; return isEqualVariable(left_metadata, right_metadata); } - case AST_TREE_TOKEN_RAW_VALUE: { + case AST_TREE_TOKEN_RAW_VALUE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: { AstTreeRawValue *left_metadata = left->metadata; AstTreeRawValue *right_metadata = right->metadata; @@ -5452,6 +5469,7 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, case AST_TREE_TOKEN_VALUE_C_FUNCTION: case AST_TREE_TOKEN_SHAPE_SHIFTER_ELEMENT: case AST_TREE_TOKEN_RAW_VALUE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: case AST_TREE_TOKEN_NONE: } printError(tree->str_begin, tree->str_end, "Unknown token %d", tree->token); @@ -7125,6 +7143,7 @@ bool setTypesBuiltinUnary(AstTree *tree, AstTreeSetTypesHelper helper, case AST_TREE_TOKEN_VALUE_BOOL: case AST_TREE_TOKEN_VALUE_OBJECT: case AST_TREE_TOKEN_RAW_VALUE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: case AST_TREE_TOKEN_OPERATOR_ASSIGN: case AST_TREE_TOKEN_OPERATOR_PLUS: case AST_TREE_TOKEN_OPERATOR_MINUS: @@ -8544,6 +8563,7 @@ size_t getSizeOfType(AstTree *type) { case AST_TREE_TOKEN_VALUE_BOOL: case AST_TREE_TOKEN_VALUE_OBJECT: case AST_TREE_TOKEN_RAW_VALUE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: case AST_TREE_TOKEN_SHAPE_SHIFTER_ELEMENT: case AST_TREE_TOKEN_OPERATOR_ASSIGN: case AST_TREE_TOKEN_OPERATOR_PLUS: diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index 89387f9..b643dc9 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -89,6 +89,7 @@ typedef enum AstTreeToken { AST_TREE_TOKEN_VALUE_BOOL, AST_TREE_TOKEN_VALUE_OBJECT, AST_TREE_TOKEN_RAW_VALUE, + AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED, AST_TREE_TOKEN_SHAPE_SHIFTER_ELEMENT, |