diff options
| author | Baitinq <[email protected]> | 2025-07-05 20:35:31 +0200 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-07-05 20:35:31 +0200 |
| commit | 2c15f6dfeaa13fbb35b3d9d1bb9fd1b179625a23 (patch) | |
| tree | 1bffaf06b8a6fa67f8fe83bf013023b502d631b9 | |
| parent | Boostrap: Support basic function calls (diff) | |
| download | pry-lang-2c15f6dfeaa13fbb35b3d9d1bb9fd1b179625a23.tar.gz pry-lang-2c15f6dfeaa13fbb35b3d9d1bb9fd1b179625a23.tar.bz2 pry-lang-2c15f6dfeaa13fbb35b3d9d1bb9fd1b179625a23.zip | |
Boostrap: Codegen for strings
| -rw-r--r-- | src/bootstrap/codegen.pry | 31 | ||||
| -rw-r--r-- | src/bootstrap/llvm.pry | 1 | ||||
| -rw-r--r-- | src/bootstrap/parser.pry | 9 |
3 files changed, 40 insertions, 1 deletions
diff --git a/src/bootstrap/codegen.pry b/src/bootstrap/codegen.pry index eea8c58..a7b5c93 100644 --- a/src/bootstrap/codegen.pry +++ b/src/bootstrap/codegen.pry @@ -251,6 +251,35 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: * return codegen_generate_literal(c, LLVMConstInt(LLVMInt64Type(), n, 0), name, expression, create_node(c, node_type)); }; + if ((*expression).type == NODE_PRIMARY_EXPRESSION_STRING) { + printf("THIS8\n"); + let str = (*cast(*NODE_PRIMARY_EXPRESSION_STRING_DATA, (*expression).data)).value; + + printf("X string: %s\n", str); + let x = LLVMBuildGlobalStringPtr((*c).builder, str, ""); + + let inner_type_data = cast(*NODE_TYPE_SIMPLE_TYPE_DATA, arena_alloc((*c).arena, sizeof(NODE_TYPE_SIMPLE_TYPE_DATA))); + (*inner_type_data).name = "i8"; + 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); + + let v = Variable{}; + v.value = x; + v.type = cast(LLVMTypeRef, null); + v.stack_level = cast(*i64, null); + v.node = expression; + v.node_type = create_node(c, node_type); + + return codegen_create_variable(c, v); + }; + if ((*expression).type == NODE_FUNCTION_DEFINITION) { printf("THIS2\n"); /* TODO: IMPLEMENT */ @@ -282,7 +311,7 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: * let function_entry = LLVMAppendBasicBlock(function, "entrypoint"); LLVMPositionBuilderAtEnd((*c).builder, function_entry); - /* TODO: SCOPE */ + environment_create_scope((*c).environment); let last_function = (*c).current_function; (*c).current_function = function; diff --git a/src/bootstrap/llvm.pry b/src/bootstrap/llvm.pry index 71dce09..67dff78 100644 --- a/src/bootstrap/llvm.pry +++ b/src/bootstrap/llvm.pry @@ -305,3 +305,4 @@ extern LLVMBuildRet = (LLVMBuilderRef, LLVMValueRef) => void; extern LLVMPointerType = (LLVMTypeRef, i64) => LLVMTypeRef; extern LLVMBuildCall2 = (LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, *LLVMValueRef, i64, *i8) => LLVMValueRef; +extern LLVMBuildGlobalStringPtr = (LLVMBuilderRef, *i8, *i8) => LLVMValueRef; diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry index 40ed001..556cc44 100644 --- a/src/bootstrap/parser.pry +++ b/src/bootstrap/parser.pry @@ -521,6 +521,15 @@ let parser_parse_primary_expression = (p: *parser) => *Node { n.data = cast(*void, d); return create_node(p, n); }; + + if (*tok).type == TOKEN_STRING { + let d = cast(*NODE_PRIMARY_EXPRESSION_STRING_DATA, arena_alloc((*p).arena, sizeof(NODE_PRIMARY_EXPRESSION_STRING_DATA))); + (*d).value = cast(*i8, (*tok).data); + let n = Node{}; + n.type = NODE_PRIMARY_EXPRESSION_STRING; + n.data = cast(*void, d); + return create_node(p, n); + }; printf("DIFF TYPE: %d\n", (*tok).type); |