diff options
| author | Baitinq <[email protected]> | 2025-05-17 22:13:32 +0200 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-05-17 22:14:45 +0200 |
| commit | 67f29942d84993e4f2198d7399de1e03deadc00b (patch) | |
| tree | fd7938d4b3cfcb64b984b4bd369b235aea68ca32 /src | |
| parent | stdlib: Fix isdigit (diff) | |
| download | interpreter-67f29942d84993e4f2198d7399de1e03deadc00b.tar.gz interpreter-67f29942d84993e4f2198d7399de1e03deadc00b.tar.bz2 interpreter-67f29942d84993e4f2198d7399de1e03deadc00b.zip | |
Codegen: Fix bug with if generation in nested functions
Diffstat (limited to 'src')
| -rw-r--r-- | src/bootstrap/tokenizer.src | 45 | ||||
| -rw-r--r-- | src/codegen.zig | 19 |
2 files changed, 31 insertions, 33 deletions
diff --git a/src/bootstrap/tokenizer.src b/src/bootstrap/tokenizer.src index 5ece444..f097a9d 100644 --- a/src/bootstrap/tokenizer.src +++ b/src/bootstrap/tokenizer.src @@ -117,12 +117,10 @@ let tokenizer_consume_until_condition = (condition: (i8) => bool) => *i8 { return null; }; -let isnt_digit = (c: i8) => bool { - return !isdigit(c); -}; - let tokenizer_accept_int_type = () => *i64 { - let string = tokenizer_consume_until_condition(isnt_digit); + let string = tokenizer_consume_until_condition((c: i8) => bool { + return !isdigit(c); + }); if string == null { return null; }; @@ -131,14 +129,9 @@ let tokenizer_accept_int_type = () => *i64 { }; let x = malloc(8); *x = atoi(string); - printf("Int: %d\n", *x); return x; }; -let is_backtick = (c: i8) => bool { - return c == '\''; -}; - let tokenizer_accept_char_type = () => *i8 { let prev_offset = offset; if !tokenizer_accept_string("'") { @@ -146,7 +139,9 @@ let tokenizer_accept_char_type = () => *i8 { return null; }; - let string = tokenizer_consume_until_condition(is_backtick); + let string = tokenizer_consume_until_condition((c: i8) => bool { + return c == '\''; + }); /*let string_len = strlen(string); let i = 0; @@ -184,10 +179,6 @@ let tokenizer_accept_char_type = () => *i8 { return string; }; -let is_quote = (c: i8) => bool { - return c == '"'; -}; - let tokenizer_accept_string_type = () => *i8 { let prev_offset = offset; if !tokenizer_accept_string("\"") { @@ -195,7 +186,9 @@ let tokenizer_accept_string_type = () => *i8 { return null; }; - let string = tokenizer_consume_until_condition(is_quote); + let string = tokenizer_consume_until_condition((c: i8) => bool { + return c == '"'; + }); if !tokenizer_accept_string("\"") { offset = prev_offset; @@ -215,16 +208,6 @@ let tokenizer_skip_comments = () => void { return; }; -let ident_cond = (c: i8) => bool { - if isalphanum(c) { - return false; - }; - if c == '_' { - return false; - }; - return true; -}; - let tokenizer_next = () => *i8 { tokenizer_skip_whitespace(); tokenizer_skip_comments(); @@ -338,7 +321,15 @@ let tokenizer_next = () => *i8 { return t; }; - let string = tokenizer_consume_until_condition(ident_cond); + let string = tokenizer_consume_until_condition((c: i8) => bool { + if isalphanum(c) { + return false; + }; + if c == '_' { + return false; + }; + return true; + }); if strlen(string) == 0 { return null; }; diff --git a/src/codegen.zig b/src/codegen.zig index d126cde..e835fed 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -23,6 +23,7 @@ pub const CodeGen = struct { arena: std.mem.Allocator, while_loop_exit: ?llvm.LLVMBasicBlockRef, + current_function: ?llvm.LLVMValueRef, pub fn init(arena: std.mem.Allocator) !*CodeGen { // Initialize LLVM @@ -44,6 +45,7 @@ pub const CodeGen = struct { .arena = arena, .while_loop_exit = null, + .current_function = null, }; return self; @@ -269,12 +271,12 @@ pub const CodeGen = struct { const current_block = llvm.LLVMGetInsertBlock(self.builder); - const then_block = llvm.LLVMAppendBasicBlock(llvm.LLVMGetLastFunction(self.llvm_module), "then_block"); + const then_block = llvm.LLVMAppendBasicBlock(self.current_function.?, "then_block"); _ = llvm.LLVMPositionBuilderAtEnd(self.builder, then_block); for (if_statement.statements) |stmt| { try self.generate_statement(stmt); } - const merge_block = llvm.LLVMAppendBasicBlock(llvm.LLVMGetLastFunction(self.llvm_module), "merge_block"); + const merge_block = llvm.LLVMAppendBasicBlock(self.current_function.?, "merge_block"); const last_instr = llvm.LLVMGetLastInstruction(llvm.LLVMGetInsertBlock(self.builder)); if (last_instr == null or llvm.LLVMIsATerminatorInst(last_instr) == null) { _ = llvm.LLVMBuildBr(self.builder, merge_block); @@ -291,13 +293,13 @@ pub const CodeGen = struct { const while_statement = statement.WHILE_STATEMENT; - const while_block = llvm.LLVMAppendBasicBlock(llvm.LLVMGetLastFunction(self.llvm_module), "while_block"); + const while_block = llvm.LLVMAppendBasicBlock(self.current_function.?, "while_block"); _ = llvm.LLVMBuildBr(self.builder, while_block); _ = llvm.LLVMPositionBuilderAtEnd(self.builder, while_block); const condition_value = try self.generate_expression_value(while_statement.condition, null); - const inner_block = llvm.LLVMAppendBasicBlock(llvm.LLVMGetLastFunction(self.llvm_module), "inner_block"); - const outer_block = llvm.LLVMAppendBasicBlock(llvm.LLVMGetLastFunction(self.llvm_module), "outer_block"); + const inner_block = llvm.LLVMAppendBasicBlock(self.current_function.?, "inner_block"); + const outer_block = llvm.LLVMAppendBasicBlock(self.current_function.?, "outer_block"); _ = llvm.LLVMBuildCondBr(self.builder, condition_value.value, inner_block, outer_block); self.while_loop_exit = outer_block; @@ -351,7 +353,12 @@ pub const CodeGen = struct { llvm.LLVMPositionBuilderAtEnd(self.builder, function_entry); try self.environment.create_scope(); - defer self.environment.drop_scope(); + const last_function = self.current_function; + self.current_function = function; + defer { + self.current_function = last_function; + self.environment.drop_scope(); + } const node_type = try self.create_node(.{ .TYPE = .{ |