diff options
| author | Baitinq <[email protected]> | 2025-07-13 22:49:17 +0200 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-07-13 22:49:17 +0200 |
| commit | e91e0917f9894ec01de9145be73e6217dcdf8aa1 (patch) | |
| tree | 41d4e54635534aa2121500eaf11d90b738bf2209 | |
| parent | Boostrap: Support struct field access (diff) | |
| download | pry-lang-e91e0917f9894ec01de9145be73e6217dcdf8aa1.tar.gz pry-lang-e91e0917f9894ec01de9145be73e6217dcdf8aa1.tar.bz2 pry-lang-e91e0917f9894ec01de9145be73e6217dcdf8aa1.zip | |
Boostrap: Support null
| -rw-r--r-- | examples/24.pry | 2 | ||||
| -rw-r--r-- | src/bootstrap/codegen.pry | 19 | ||||
| -rw-r--r-- | src/bootstrap/llvm.pry | 1 | ||||
| -rw-r--r-- | src/bootstrap/parser.pry | 6 |
4 files changed, 26 insertions, 2 deletions
diff --git a/examples/24.pry b/examples/24.pry index f30a7fc..72dea07 100644 --- a/examples/24.pry +++ b/examples/24.pry @@ -42,6 +42,8 @@ X: 0 Y: (null) X: 4 Y: hi +X: 0 +Y: bye Expected return: 0 diff --git a/src/bootstrap/codegen.pry b/src/bootstrap/codegen.pry index d8cf35d..99324fb 100644 --- a/src/bootstrap/codegen.pry +++ b/src/bootstrap/codegen.pry @@ -353,9 +353,24 @@ let codegen_get_struct_field = (c: *codegen, node: *Node, name: *i8) => *StructF }; let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *i8) => *Variable { - printf("NAME: %s\n", name); + printf("NAME %d: \n", (*expression).type); + if ((*expression).type == NODE_PRIMARY_EXPRESSION_NULL) { + let inner_type_data = cast(*NODE_TYPE_SIMPLE_TYPE_DATA, arena_alloc((*c).arena, sizeof(NODE_TYPE_SIMPLE_TYPE_DATA))); + (*inner_type_data).name = "void"; + let inner_type = Node{}; + inner_type.type = NODE_TYPE_SIMPLE_TYPE; + inner_type.data = cast(*void, inner_type_data); + + let node_type_data = cast(*NODE_TYPE_POINTER_TYPE_DATA, arena_alloc((*c).arena, sizeof(NODE_TYPE_POINTER_TYPE_DATA))); + (*node_type_data).type = create_node(c, inner_type); + let node_type = Node{}; + node_type.type = NODE_TYPE_POINTER_TYPE; + node_type.data = cast(*void, node_type_data); + + return codegen_generate_literal(c, LLVMConstNull(LLVMPointerType(LLVMInt8Type(), 0)), name, expression, create_node(c, node_type)); + }; + if ((*expression).type == NODE_PRIMARY_EXPRESSION_NUMBER) { - printf("THIS\n"); let n = (*cast(*NODE_PRIMARY_EXPRESSION_NUMBER_DATA, (*expression).data)).value; printf("X: %d\n", n); diff --git a/src/bootstrap/llvm.pry b/src/bootstrap/llvm.pry index 9b0e150..6ae7182 100644 --- a/src/bootstrap/llvm.pry +++ b/src/bootstrap/llvm.pry @@ -265,6 +265,7 @@ let LLVMBasicBlockRef = newtype *void; extern LLVMGetModuleDataLayout = (LLVMModuleRef) => LLVMTargetDataRef; extern LLVMConstInt = (LLVMTypeRef, i64, i64) => LLVMValueRef; +extern LLVMConstNull = (LLVMTypeRef) => LLVMValueRef; extern LLVMInt64Type = () => LLVMTypeRef; extern LLVMInt32Type = () => LLVMTypeRef; extern LLVMInt1Type = () => LLVMTypeRef; diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry index 155244f..cf3c233 100644 --- a/src/bootstrap/parser.pry +++ b/src/bootstrap/parser.pry @@ -814,6 +814,12 @@ let parser_parse_primary_expression = (p: *parser) => *Node { printf("NO TOK\n"); return cast(*Node, null); }; + + if (*tok).type == TOKEN_NULL { + let n = Node{}; + n.type = NODE_PRIMARY_EXPRESSION_NULL; + return create_node(p, n); + }; if (*tok).type == TOKEN_IDENTIFIER { let d = cast(*NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, arena_alloc((*p).arena, sizeof(NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA))); |