diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-29 20:05:54 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-29 20:05:54 +0330 |
commit | 2316751587cf3998112f4e076b5b33080ce66124 (patch) | |
tree | 2d9a2388a9028ea0262b7766511dd7b5d918a843 /src/compiler | |
parent | e73184852285ffbb110a96ca7d7e1906029ba825 (diff) |
fix bug in conditions
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/ast-tree.c | 33 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 1 | ||||
-rw-r--r-- | src/compiler/parser.c | 21 |
3 files changed, 37 insertions, 18 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 3963e77..2f9c27c 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -260,8 +260,8 @@ void astTreePrint(const AstTree *tree, int indent) { } goto RETURN_SUCCESS; case AST_TREE_TOKEN_VALUE_BOOL: { - AstTreeBool metadata = (AstTreeBool)tree->metadata; - printf(",value=%b", metadata); + AstTreeBool *metadata = tree->metadata; + printf(",value=%b", *metadata); } goto RETURN_SUCCESS; case AST_TREE_TOKEN_TYPE_FUNCTION: { @@ -457,9 +457,13 @@ void astTreeDestroy(AstTree tree) { case AST_TREE_TOKEN_TYPE_BOOL: case AST_TREE_TOKEN_VALUE_NULL: case AST_TREE_TOKEN_VALUE_VOID: - case AST_TREE_TOKEN_VALUE_BOOL: case AST_TREE_TOKEN_VARIABLE_DEFINE: return; + case AST_TREE_TOKEN_VALUE_BOOL: { + AstTreeBool *metadata = tree.metadata; + free(metadata); + return; + } case AST_TREE_TOKEN_VALUE_INT: { AstTreeInt *metadata = tree.metadata; free(metadata); @@ -642,9 +646,13 @@ AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[], tree->token, NULL, copyAstTreeBack(tree->type, oldVariables, newVariables, variables_size), tree->str_begin, tree->str_end); - case AST_TREE_TOKEN_VALUE_BOOL: - return newAstTree(tree->token, tree->metadata, tree->type, tree->str_begin, + case AST_TREE_TOKEN_VALUE_BOOL: { + AstTreeBool *metadata = tree->metadata; + AstTreeBool *newMetadata = a404m_malloc(sizeof(*newMetadata)); + *newMetadata = *metadata; + return newAstTree(tree->token, newMetadata, tree->type, tree->str_begin, tree->str_end); + } case AST_TREE_TOKEN_VALUE_INT: { AstTreeInt *metadata = tree->metadata; AstTreeInt *newMetadata = a404m_malloc(sizeof(*newMetadata)); @@ -1219,10 +1227,8 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeHelper *helper) { return astTreeParseValue(parserNode, AST_TREE_TOKEN_VALUE_FLOAT, sizeof(AstTreeFloat)); case PARSER_TOKEN_VALUE_BOOL: - return newAstTree( - AST_TREE_TOKEN_VALUE_BOOL, - (void *)(AstTreeBool)(ParserNodeBoolMetadata)parserNode->metadata, - &AST_TREE_BOOL_TYPE, parserNode->str_begin, parserNode->str_end); + return astTreeParseValue(parserNode, AST_TREE_TOKEN_VALUE_BOOL, + sizeof(AstTreeBool)); case PARSER_TOKEN_KEYWORD_NULL: return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_VALUE_NULL); case PARSER_TOKEN_KEYWORD_PRINT_U64: @@ -2626,8 +2632,9 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: case AST_TREE_TOKEN_VALUE_VOID: - case AST_TREE_TOKEN_VALUE_BOOL: return true; + case AST_TREE_TOKEN_VALUE_BOOL: + return setTypesValueBool(tree, helper); case AST_TREE_TOKEN_VALUE_INT: return setTypesValueInt(tree, helper); case AST_TREE_TOKEN_VALUE_FLOAT: @@ -2687,6 +2694,12 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, UNREACHABLE; } +bool setTypesValueBool(AstTree *tree, AstTreeSetTypesHelper helper) { + (void)helper; + tree->type = &AST_TREE_BOOL_TYPE; + return true; +} + bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { if (helper.lookingType == NULL || typeIsEqual(helper.lookingType, &AST_TREE_I64_TYPE)) { diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index a553a1d..d6c2523 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -252,6 +252,7 @@ bool isCircularDependenciesVariable(AstTreeHelper *helper, bool setAllTypesRoot(AstTreeRoot *root, AstTreeHelper *helper); bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, AstTreeFunction *function); +bool setTypesValueBool(AstTree *tree, AstTreeSetTypesHelper helper); bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper); bool setTypesValueFloat(AstTree *tree, AstTreeSetTypesHelper helper); bool setTypesValueNull(AstTree *tree, AstTreeSetTypesHelper helper); diff --git a/src/compiler/parser.c b/src/compiler/parser.c index db189ed..69209ab 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -218,8 +218,8 @@ void parserNodePrint(const ParserNode *node, int indent) { } goto RETURN_SUCCESS; case PARSER_TOKEN_VALUE_BOOL: { - ParserNodeIntMetadata metadata = (ParserNodeIntMetadata)node->metadata; - printf(",value=%b", (ParserNodeBoolMetadata)metadata); + ParserNodeBoolMetadata *metadata = node->metadata; + printf(",value=%b", *metadata); } goto RETURN_SUCCESS; case PARSER_TOKEN_CONSTANT: @@ -455,9 +455,14 @@ void parserNodeDelete(ParserNode *node) { case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: - case PARSER_TOKEN_VALUE_BOOL: case PARSER_TOKEN_KEYWORD_NULL: goto RETURN_SUCCESS; + case PARSER_TOKEN_VALUE_BOOL: { + ParserNodeBoolMetadata *metadata = node->metadata; + free(metadata); + } + goto RETURN_SUCCESS; + case PARSER_TOKEN_VALUE_INT: { ParserNodeIntMetadata *metadata = node->metadata; free(metadata); @@ -979,11 +984,11 @@ ParserNode *parserNumber(LexerNode *node, ParserNode *parent) { } ParserNode *parserBoolValue(LexerNode *node, ParserNode *parent) { - return node->parserNode = newParserNode( - PARSER_TOKEN_VALUE_BOOL, node->str_begin, node->str_end, - (void *)(ParserNodeBoolMetadata)(node->token == - LEXER_TOKEN_KEYWORD_TRUE), - parent); + ParserNodeBoolMetadata *metadata = a404m_malloc(sizeof(*metadata)); + *metadata = node->token == LEXER_TOKEN_KEYWORD_TRUE; + return node->parserNode = + newParserNode(PARSER_TOKEN_VALUE_BOOL, node->str_begin, + node->str_end, metadata, parent); } ParserNode *parserEol(LexerNode *node, LexerNode *begin, ParserNode *parent) { |