diff options
| author | Baitinq <[email protected]> | 2025-07-06 18:17:47 +0200 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-07-06 18:17:47 +0200 |
| commit | 9d67b769b14ad708f902346c0d21cb120c21c0a1 (patch) | |
| tree | 1d3dc8cb2305a0751af5a4e3813c7d226a191a05 /src | |
| parent | Boostrap: Improve parser and codegen function calls values (diff) | |
| download | pry-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.pry | 33 |
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; }; |