about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-06 18:17:47 +0200
committerBaitinq <[email protected]>2025-07-06 18:17:47 +0200
commit9d67b769b14ad708f902346c0d21cb120c21c0a1 (patch)
tree1d3dc8cb2305a0751af5a4e3813c7d226a191a05 /src
parentBoostrap: Improve parser and codegen function calls values (diff)
downloadpry-lang-9d67b769b14ad708f902346c0d21cb120c21c0a1.tar.gz
pry-lang-9d67b769b14ad708f902346c0d21cb120c21c0a1.tar.bz2
pry-lang-9d67b769b14ad708f902346c0d21cb120c21c0a1.zip
Boostrap: Improve codegen for function declaration (starting to work on params)
Diffstat (limited to 'src')
-rw-r--r--src/bootstrap/codegen.pry33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/bootstrap/codegen.pry b/src/bootstrap/codegen.pry
index 99ed573..50a8284 100644
--- a/src/bootstrap/codegen.pry
+++ b/src/bootstrap/codegen.pry
@@ -281,6 +281,15 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 		return codegen_create_variable(c, v);
 	};
 	
+	if ((*expression).type == NODE_PRIMARY_EXPRESSION_IDENTIFIER) {
+		let identifier = *cast(*NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, (*expression).data);
+		let variable = environment_get_variable((*c).environment, identifier.name);
+		if variable == cast(*Variable, null) {
+			printf("HEREBAD!\n");
+			return cast(*Variable, null);
+		};
+	};
+	
 	if ((*expression).type == NODE_FUNCTION_DEFINITION) {
 		printf("THIS2\n");
 	/* TODO: IMPLEMENT */
@@ -296,8 +305,29 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 		let function_definition = *cast(*NODE_FUNCTION_DEFINITION_DATA, (*expression).data);
 
 		let i = 0;
-		/* TODO */
+		let is_varargs = 0;
 		while i < function_definition.parameters_len {
+			let node = *(function_definition.parameters + cast(**Node, i));
+			assert((*node).type == NODE_PRIMARY_EXPRESSION_IDENTIFIER);
+			let param = *cast(*NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, (*node).data);
+			let param_type = param.type;
+			if (*param_type).type == NODE_TYPE_SIMPLE_TYPE {
+				let simple_type = *(cast(*NODE_TYPE_SIMPLE_TYPE_DATA, (*param_type).data));
+				if strcmp(simple_type.name, "varargs") {
+					is_varargs = 1;
+				};
+			};
+			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);
+			};
+			if (*param_type).type == NODE_TYPE_SIMPLE_TYPE {
+                        	(*llvm_param_type) = LLVMPointerType(*llvm_param_type, 0);
+			};
+
+			(*(llvm_param_types + cast(*LLVMTypeRef, i))) = *llvm_param_type;
+			(*(param_types + cast(**Node, i))) = param_type;
 			i = i + 1;
 		};
 
@@ -339,6 +369,7 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 		/* TODO */
 		let parameters_index = 0;
 		while parameters_index < function_definition.parameters_len {
+			/* DO */
 			parameters_index = parameters_index + 1;
 		};