about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-13 17:50:08 +0200
committerBaitinq <[email protected]>2025-07-13 17:50:08 +0200
commit78458e09a22499193eeb9ee6e852789187b1d044 (patch)
treec79237fd1665a59f78656485bf5ede01ee395cd4
parentBoostrap: Support struct definition (diff)
downloadpry-lang-78458e09a22499193eeb9ee6e852789187b1d044.tar.gz
pry-lang-78458e09a22499193eeb9ee6e852789187b1d044.tar.bz2
pry-lang-78458e09a22499193eeb9ee6e852789187b1d044.zip
Boostrap: Support struct instanciation
-rw-r--r--src/bootstrap/codegen.pry15
-rw-r--r--src/bootstrap/parser.pry27
2 files changed, 42 insertions, 0 deletions
diff --git a/src/bootstrap/codegen.pry b/src/bootstrap/codegen.pry
index 9363265..858ebfa 100644
--- a/src/bootstrap/codegen.pry
+++ b/src/bootstrap/codegen.pry
@@ -170,6 +170,14 @@ let codegen_get_llvm_type = (c: *codegen, node: *Node) => *LLVMTypeRef {
 			return r;
 		};
 
+		let v = environment_get_variable((*c).environment, simple_type.name);
+		if (v != cast(*Variable, null)) {
+			assert((*v).type != cast(LLVMTypeRef, null));
+			let r = cast(*LLVMTypeRef, arena_alloc((*c).arena, sizeof(LLVMTypeRef)));
+			*r = (*v).type;
+			return r;
+		};
+
 		printf("NO SIMPLE TYPE %s!\n", simple_type.name);
 		assert(false);
 	};
@@ -783,6 +791,13 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 		v.node_type = simple_type_node;
 		return codegen_create_variable(c, v);
 	};
+	
+	if ((*expression).type == NODE_STRUCT_INSTANCIATION) {
+		let struc_data = *cast(*NODE_STRUCT_INSTANCIATION_DATA, (*expression).data);
+		let v = environment_get_variable((*c).environment, struc_data.typ);
+		assert(v != cast(*Variable, null));
+		return v;
+	};
 
 	printf("ASSERT 1: %d\n", (*expression).type);
 	assert(false);
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index 8cefefd..658d1f9 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -732,6 +732,29 @@ let parser_parse_function_definition = (p: *parser) => *Node {
 	return create_node(p, n); 
 };
 
+let parser_parse_struct_instanciation = (p: *parser) => *Node {
+	let typ = parser_accept_token(p, TOKEN_IDENTIFIER);
+	if typ == cast(*token, null) {
+		return cast(*Node, null);
+	};
+
+	if parser_accept_token(p, TOKEN_LBRACE) == cast(*token, null) {
+		return cast(*Node, null);
+	};
+	if parser_accept_token(p, TOKEN_RBRACE) == cast(*token, null) {
+		return cast(*Node, null);
+	};
+
+	let d = cast(*NODE_STRUCT_INSTANCIATION_DATA, arena_alloc((*p).arena, sizeof(NODE_STRUCT_INSTANCIATION_DATA)));
+	(*d).typ = cast(*i8, (*typ).data);
+
+	let n = Node{};
+	n.type = NODE_STRUCT_INSTANCIATION;
+	n.data = cast(*void, d);
+
+	return create_node(p, n); 
+};
+
 /* PrimaryExpression ::= NULL | NUMBER | BOOLEAN | CHAR | STRING | IDENTIFIER | FunctionDefinition | StructDefinition | StructInstantiation | FieldAccess | LPAREN Expression RPAREN */
 let parser_parse_primary_expression = (p: *parser) => *Node {
 	let stmt = parser_accept_parse(p, parser_parse_function_definition);
@@ -742,6 +765,10 @@ let parser_parse_primary_expression = (p: *parser) => *Node {
 	if stmt != cast(*Node, null) {
 		return stmt;
 	};
+	let stmt = parser_accept_parse(p, parser_parse_struct_instanciation);
+	if stmt != cast(*Node, null) {
+		return stmt;
+	};
 
 	if parser_accept_token(p, TOKEN_LPAREN) != cast(*token, null) {
 		let expr = parser_parse_expression(p);