about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-07 23:50:06 +0200
committerBaitinq <[email protected]>2025-07-07 23:50:06 +0200
commit6818776dd5866ff07938cbdf8dbfdf6cea62fe34 (patch)
treeb5e4e515b202a30fb98f4857400584d72eff32f2 /src
parentBoostrap: Codegen function definition arguments (diff)
downloadpry-lang-6818776dd5866ff07938cbdf8dbfdf6cea62fe34.tar.gz
pry-lang-6818776dd5866ff07938cbdf8dbfdf6cea62fe34.tar.bz2
pry-lang-6818776dd5866ff07938cbdf8dbfdf6cea62fe34.zip
Bootstrap: Codegen: Support bool types
Diffstat (limited to 'src')
-rw-r--r--src/bootstrap/codegen.pry26
-rw-r--r--src/bootstrap/llvm.pry1
-rw-r--r--src/bootstrap/parser.pry9
3 files changed, 36 insertions, 0 deletions
diff --git a/src/bootstrap/codegen.pry b/src/bootstrap/codegen.pry
index c8032d9..1bb20ca 100644
--- a/src/bootstrap/codegen.pry
+++ b/src/bootstrap/codegen.pry
@@ -145,6 +145,12 @@ let codegen_get_llvm_type = (c: *codegen, node: *Node) => *LLVMTypeRef {
 			return r;
 		};
 		
+		if strcmp(simple_type.name, "bool") {
+			let r = cast(*LLVMTypeRef, arena_alloc((*c).arena, sizeof(LLVMTypeRef)));
+			*r = LLVMInt1Type();
+			return r;
+		};
+		
 		if strcmp(simple_type.name, "void") {
 			let r = cast(*LLVMTypeRef, arena_alloc((*c).arena, sizeof(LLVMTypeRef)));
 			*r = LLVMVoidType();
@@ -252,6 +258,26 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 		return codegen_generate_literal(c, LLVMConstInt(LLVMInt64Type(), n, 0), name, expression, create_node(c, node_type));
 	};
 	
+	if ((*expression).type == NODE_PRIMARY_EXPRESSION_BOOLEAN) {
+		printf("THIS\n");
+		let b = (*cast(*NODE_PRIMARY_EXPRESSION_BOOLEAN_DATA, (*expression).data)).value;
+		
+		let node_type = Node{};
+		node_type.type = NODE_TYPE_SIMPLE_TYPE;
+
+		let d = cast(*NODE_TYPE_SIMPLE_TYPE_DATA, arena_alloc((*c).arena, sizeof(NODE_TYPE_SIMPLE_TYPE_DATA)));
+		(*d).name = "bool";
+		(*d).underlying_type = cast(*Node, null);
+		node_type.data = cast(*void, d);
+
+		let int_value = 0;
+		if b == true {
+			int_value = 1;
+		};
+		
+		return codegen_generate_literal(c, LLVMConstInt(LLVMInt1Type(), int_value, 0), name, expression, create_node(c, node_type));
+	};
+	
 	if ((*expression).type == NODE_PRIMARY_EXPRESSION_STRING) {
 		printf("THIS8\n");
 		let str = (*cast(*NODE_PRIMARY_EXPRESSION_STRING_DATA, (*expression).data)).value;
diff --git a/src/bootstrap/llvm.pry b/src/bootstrap/llvm.pry
index ba8aa8f..4183b99 100644
--- a/src/bootstrap/llvm.pry
+++ b/src/bootstrap/llvm.pry
@@ -262,6 +262,7 @@ let LLVMBasicBlockRef = newtype *void;
 
 extern LLVMConstInt = (LLVMTypeRef, i64, i64) => LLVMValueRef;
 extern LLVMInt64Type = () => LLVMTypeRef;
+extern LLVMInt1Type = () => LLVMTypeRef;
 extern LLVMInt8Type = () => LLVMTypeRef;
 extern LLVMVoidType = () => LLVMTypeRef;
 
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index 8bc1c2e..63d17c8 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -523,6 +523,15 @@ let parser_parse_primary_expression = (p: *parser) => *Node {
 	    return create_node(p, n);
 	};
 	
+	if (*tok).type == TOKEN_BOOLEAN {
+	    let d = cast(*NODE_PRIMARY_EXPRESSION_BOOLEAN_DATA, arena_alloc((*p).arena, sizeof(NODE_PRIMARY_EXPRESSION_BOOLEAN_DATA)));
+	    (*d).value = *(cast(*bool, (*tok).data));
+	    let n = Node{};
+	    n.type = NODE_PRIMARY_EXPRESSION_BOOLEAN;
+	    n.data = cast(*void, d);
+	    return create_node(p, n);
+	};
+	
 	if (*tok).type == TOKEN_STRING {
 	    let d = cast(*NODE_PRIMARY_EXPRESSION_STRING_DATA, arena_alloc((*p).arena, sizeof(NODE_PRIMARY_EXPRESSION_STRING_DATA)));
 	    (*d).value = cast(*i8, (*tok).data);