about summary refs log tree commit diff
path: root/src/bootstrap/codegen.pry
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-12 09:49:27 +0200
committerBaitinq <[email protected]>2025-07-12 17:43:28 +0200
commit954f79db55ed4bd0349907d7b580ec5205e5e295 (patch)
treee9e464dff0ee72a27519b087d80690c0c9dfe893 /src/bootstrap/codegen.pry
parentBoostrap: Support cast statement (diff)
downloadpry-lang-954f79db55ed4bd0349907d7b580ec5205e5e295.tar.gz
pry-lang-954f79db55ed4bd0349907d7b580ec5205e5e295.tar.bz2
pry-lang-954f79db55ed4bd0349907d7b580ec5205e5e295.zip
Boostrap: Implement import
Diffstat (limited to 'src/bootstrap/codegen.pry')
-rw-r--r--src/bootstrap/codegen.pry32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/bootstrap/codegen.pry b/src/bootstrap/codegen.pry
index 50836cc..6d5b1c8 100644
--- a/src/bootstrap/codegen.pry
+++ b/src/bootstrap/codegen.pry
@@ -21,15 +21,18 @@ let Environment = struct {
 };
 
 let environment_create_scope = (e: *Environment) => void {
+	printf("CREATE SCOPE!!!!!!!!!!!: %d\n", (*e).scope_stack_len);
 	let scope = cast(*Scope, arena_alloc((*e).arena, sizeof(Scope)));
 	(*scope).variables = hashmap_init(16, (*e).arena);
 	(*((*e).scope_stack + cast(**Scope, (*e).scope_stack_len))) = scope;
 	(*e).scope_stack_len = (*e).scope_stack_len + 1;
+	printf("AFTER SCOPE!!!!!!!!!!!: %d\n", (*e).scope_stack_len);
 
 	return;
 };
 
 let environment_drop_scope = (e: *Environment) => void {
+	printf("DROP SCOPE!!!!!!!!!!!\n");
 	(*e).scope_stack_len = (*e).scope_stack_len - 1;
 
 	return;
@@ -57,8 +60,11 @@ let environment_get_variable = (e: *Environment, name: *i8) => *Variable {
 };
 
 let environment_add_variable = (e: *Environment, name: *i8, variable: *Variable) => void {
+	printf("B4 XXXX %d\n", (*e).scope_stack_len);
 	let top_scope = *(((*e).scope_stack + cast(**Scope, (*e).scope_stack_len - 1)));
+	printf("XXXX %d\n", (*e).scope_stack_len);
 	hashmap_put((*top_scope).variables, name, cast(*void, variable));
+	printf("XXXXY\n");
 
 	return;
 };
@@ -417,7 +423,6 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 		let params = cast(*LLVMValueRef, arena_alloc((*c).arena, sizeof(LLVMValueRef) * function_definition.parameters_len));
 		LLVMGetParams(function, params);
 
-
 		/* TODO */
 		let parameters_index = 0;
 		while parameters_index < function_definition.parameters_len {
@@ -427,10 +432,7 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 			let param = *cast(*NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, (*param_node).data);
 			let param_type = param.type;
 			let llvm_param_type = codegen_get_llvm_type(c, param_type);
-			if llvm_param_type == cast(*LLVMTypeRef, null) {
-				printf("LEL3\n");
-				return cast(*Variable, null);
-			};
+			assert(llvm_param_type != cast(*LLVMTypeRef, null));
 			if (*param_type).type == NODE_TYPE_FUNCTION_TYPE {
                         	(*llvm_param_type) = LLVMPointerType(*llvm_param_type, 0);
 			};
@@ -443,7 +445,10 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 			v.stack_level = cast(*i64, null);
 			v.node = param_node;
 			v.node_type = param_type;
-			environment_add_variable((*c).environment, param.name, codegen_create_variable(c, v));
+let xx =codegen_create_variable(c, v);
+		printf("THERE %s\n", param.name);
+			environment_add_variable((*c).environment, param.name, xx);
+		printf("HERE\n");
 			parameters_index = parameters_index + 1;
 		};
 
@@ -452,10 +457,7 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 			let stmt = *(function_definition.statements + cast(**Node, i));
 
 			let res = codegen_generate_statement(c, stmt);
-			if res != 0 {
-				printf("LEL\n");
-				return cast(*Variable, null);
-			};
+			assert(res == 0);
 
 			i = i + 1;
 		};
@@ -905,6 +907,12 @@ let codegen_generate_while_statement = (c: *codegen, statement: *NODE_WHILE_STAT
 	return null;
 };
 
+extern codegen_generate = (*codegen, *Node) => i64;
+
+let codegen_generate_import_declaration = (c: *codegen, statement: *NODE_IMPORT_DECLARATION_DATA) => i64 {
+	return codegen_generate(c, (*statement).program);
+};
+
 let codegen_generate_statement = (c: *codegen, statement: *Node) => i64 {
 	let stmt = *statement;
 
@@ -930,6 +938,10 @@ let codegen_generate_statement = (c: *codegen, statement: *Node) => i64 {
 		codegen_generate_while_statement(c, cast(*NODE_WHILE_STATEMENT_DATA, stmt.data));
 		return 0;
 	};
+	
+	if stmt.type == NODE_IMPORT_DECLARATION {
+		return codegen_generate_import_declaration(c, cast(*NODE_IMPORT_DECLARATION_DATA, stmt.data));
+	};
 
 	printf("ASSERT 3 %d\n", stmt.type);
 	assert(false);