From 9d67b769b14ad708f902346c0d21cb120c21c0a1 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Sun, 6 Jul 2025 18:17:47 +0200 Subject: Boostrap: Improve codegen for function declaration (starting to work on params) --- examples/-1.pry | 4 ++-- examples/0.pry | 2 -- src/bootstrap/codegen.pry | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/examples/-1.pry b/examples/-1.pry index 5d7b65c..f5b7928 100644 --- a/examples/-1.pry +++ b/examples/-1.pry @@ -6,8 +6,8 @@ let test = () => i64 { return 2; }; -let main = () => i64 { - printf("HELLO WORLD!\n"); +let main = (argc: i64) => i64 { + printf("HELLO WORLD %d!\n", argc); return test(); }; diff --git a/examples/0.pry b/examples/0.pry index 90a6861..d0054f2 100644 --- a/examples/0.pry +++ b/examples/0.pry @@ -1,7 +1,5 @@ /* HELLO! Welcome to the unnamed language */ -import "!stdlib.pry"; - let main = (argc: i64, argv: *i64) => i64 { printf("%d\n", argc); 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; }; -- cgit 1.4.1