summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-03-29 20:05:54 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-03-29 20:05:54 +0330
commit2316751587cf3998112f4e076b5b33080ce66124 (patch)
tree2d9a2388a9028ea0262b7766511dd7b5d918a843 /src/compiler
parente73184852285ffbb110a96ca7d7e1906029ba825 (diff)
fix bug in conditions
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/ast-tree.c33
-rw-r--r--src/compiler/ast-tree.h1
-rw-r--r--src/compiler/parser.c21
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) {