about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-13 22:49:17 +0200
committerBaitinq <[email protected]>2025-07-13 22:49:17 +0200
commite91e0917f9894ec01de9145be73e6217dcdf8aa1 (patch)
tree41d4e54635534aa2121500eaf11d90b738bf2209
parentBoostrap: Support struct field access (diff)
downloadpry-lang-e91e0917f9894ec01de9145be73e6217dcdf8aa1.tar.gz
pry-lang-e91e0917f9894ec01de9145be73e6217dcdf8aa1.tar.bz2
pry-lang-e91e0917f9894ec01de9145be73e6217dcdf8aa1.zip
Boostrap: Support null
-rw-r--r--examples/24.pry2
-rw-r--r--src/bootstrap/codegen.pry19
-rw-r--r--src/bootstrap/llvm.pry1
-rw-r--r--src/bootstrap/parser.pry6
4 files changed, 26 insertions, 2 deletions
diff --git a/examples/24.pry b/examples/24.pry
index f30a7fc..72dea07 100644
--- a/examples/24.pry
+++ b/examples/24.pry
@@ -42,6 +42,8 @@ X: 0
 Y: (null)
 X: 4
 Y: hi
+X: 0
+Y: bye
 
 Expected return: 0
 
diff --git a/src/bootstrap/codegen.pry b/src/bootstrap/codegen.pry
index d8cf35d..99324fb 100644
--- a/src/bootstrap/codegen.pry
+++ b/src/bootstrap/codegen.pry
@@ -353,9 +353,24 @@ let codegen_get_struct_field = (c: *codegen, node: *Node, name: *i8) => *StructF
 };
 
 let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *i8) => *Variable {
-	printf("NAME: %s\n", name);
+	printf("NAME %d: \n", (*expression).type);
+	if ((*expression).type == NODE_PRIMARY_EXPRESSION_NULL) {
+		let inner_type_data = cast(*NODE_TYPE_SIMPLE_TYPE_DATA, arena_alloc((*c).arena, sizeof(NODE_TYPE_SIMPLE_TYPE_DATA)));
+		(*inner_type_data).name = "void";
+		let inner_type = Node{};
+		inner_type.type = NODE_TYPE_SIMPLE_TYPE;
+		inner_type.data = cast(*void, inner_type_data);
+
+		let node_type_data = cast(*NODE_TYPE_POINTER_TYPE_DATA, arena_alloc((*c).arena, sizeof(NODE_TYPE_POINTER_TYPE_DATA)));
+		(*node_type_data).type = create_node(c, inner_type);
+		let node_type = Node{};
+		node_type.type = NODE_TYPE_POINTER_TYPE;
+		node_type.data = cast(*void, node_type_data);
+
+		return codegen_generate_literal(c, LLVMConstNull(LLVMPointerType(LLVMInt8Type(), 0)), name, expression, create_node(c, node_type));
+	};
+
 	if ((*expression).type == NODE_PRIMARY_EXPRESSION_NUMBER) {
-		printf("THIS\n");
 		let n = (*cast(*NODE_PRIMARY_EXPRESSION_NUMBER_DATA, (*expression).data)).value;
 		
 		printf("X: %d\n", n);
diff --git a/src/bootstrap/llvm.pry b/src/bootstrap/llvm.pry
index 9b0e150..6ae7182 100644
--- a/src/bootstrap/llvm.pry
+++ b/src/bootstrap/llvm.pry
@@ -265,6 +265,7 @@ let LLVMBasicBlockRef = newtype *void;
 
 extern LLVMGetModuleDataLayout = (LLVMModuleRef) => LLVMTargetDataRef;
 extern LLVMConstInt = (LLVMTypeRef, i64, i64) => LLVMValueRef;
+extern LLVMConstNull = (LLVMTypeRef) => LLVMValueRef;
 extern LLVMInt64Type = () => LLVMTypeRef;
 extern LLVMInt32Type = () => LLVMTypeRef;
 extern LLVMInt1Type = () => LLVMTypeRef;
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index 155244f..cf3c233 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -814,6 +814,12 @@ let parser_parse_primary_expression = (p: *parser) => *Node {
 	printf("NO TOK\n");
 	    return cast(*Node, null); 
 	};
+	
+	if (*tok).type == TOKEN_NULL {
+	    let n = Node{};
+	    n.type = NODE_PRIMARY_EXPRESSION_NULL;
+	    return create_node(p, n);
+	};
 
 	if (*tok).type == TOKEN_IDENTIFIER {
 	    let d = cast(*NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, arena_alloc((*p).arena, sizeof(NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA)));