about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-05 20:35:31 +0200
committerBaitinq <[email protected]>2025-07-05 20:35:31 +0200
commit2c15f6dfeaa13fbb35b3d9d1bb9fd1b179625a23 (patch)
tree1bffaf06b8a6fa67f8fe83bf013023b502d631b9
parentBoostrap: Support basic function calls (diff)
downloadpry-lang-2c15f6dfeaa13fbb35b3d9d1bb9fd1b179625a23.tar.gz
pry-lang-2c15f6dfeaa13fbb35b3d9d1bb9fd1b179625a23.tar.bz2
pry-lang-2c15f6dfeaa13fbb35b3d9d1bb9fd1b179625a23.zip
Boostrap: Codegen for strings
-rw-r--r--src/bootstrap/codegen.pry31
-rw-r--r--src/bootstrap/llvm.pry1
-rw-r--r--src/bootstrap/parser.pry9
3 files changed, 40 insertions, 1 deletions
diff --git a/src/bootstrap/codegen.pry b/src/bootstrap/codegen.pry
index eea8c58..a7b5c93 100644
--- a/src/bootstrap/codegen.pry
+++ b/src/bootstrap/codegen.pry
@@ -251,6 +251,35 @@ 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_STRING) {
+		printf("THIS8\n");
+		let str = (*cast(*NODE_PRIMARY_EXPRESSION_STRING_DATA, (*expression).data)).value;
+		
+		printf("X string: %s\n", str);
+		let x = LLVMBuildGlobalStringPtr((*c).builder, str, "");
+
+		let inner_type_data = cast(*NODE_TYPE_SIMPLE_TYPE_DATA, arena_alloc((*c).arena, sizeof(NODE_TYPE_SIMPLE_TYPE_DATA)));
+		(*inner_type_data).name = "i8";
+		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);
+
+		let v = Variable{};
+		v.value = x;
+		v.type = cast(LLVMTypeRef, null);
+		v.stack_level = cast(*i64, null);
+		v.node = expression;
+		v.node_type = create_node(c, node_type);
+
+		return codegen_create_variable(c, v);
+	};
+	
 	if ((*expression).type == NODE_FUNCTION_DEFINITION) {
 		printf("THIS2\n");
 	/* TODO: IMPLEMENT */
@@ -282,7 +311,7 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
                 let function_entry = LLVMAppendBasicBlock(function, "entrypoint");
                 LLVMPositionBuilderAtEnd((*c).builder, function_entry);
 
-		/* TODO: SCOPE */
+
 		environment_create_scope((*c).environment);
 		let last_function = (*c).current_function;
 		(*c).current_function = function;
diff --git a/src/bootstrap/llvm.pry b/src/bootstrap/llvm.pry
index 71dce09..67dff78 100644
--- a/src/bootstrap/llvm.pry
+++ b/src/bootstrap/llvm.pry
@@ -305,3 +305,4 @@ extern LLVMBuildRet = (LLVMBuilderRef, LLVMValueRef) => void;
 extern LLVMPointerType = (LLVMTypeRef, i64) => LLVMTypeRef;
 
 extern LLVMBuildCall2 = (LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, *LLVMValueRef, i64, *i8) => LLVMValueRef;
+extern LLVMBuildGlobalStringPtr = (LLVMBuilderRef, *i8, *i8) => LLVMValueRef;
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index 40ed001..556cc44 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -521,6 +521,15 @@ let parser_parse_primary_expression = (p: *parser) => *Node {
 	    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);
+	    let n = Node{};
+	    n.type = NODE_PRIMARY_EXPRESSION_STRING;
+	    n.data = cast(*void, d);
+	    return create_node(p, n);
+	};
 
 	printf("DIFF TYPE: %d\n", (*tok).type);