diff options
| author | Baitinq <[email protected]> | 2025-05-10 19:59:33 +0200 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-05-10 20:19:31 +0200 |
| commit | e3feb1a2ea12cd16db3e759c4aa6c05c8cd100a1 (patch) | |
| tree | f53c186faa18e72dc19b157186ab968db5b5b163 /src/codegen.zig | |
| parent | Feature: Add initial stdlib (diff) | |
| download | interpreter-e3feb1a2ea12cd16db3e759c4aa6c05c8cd100a1.tar.gz interpreter-e3feb1a2ea12cd16db3e759c4aa6c05c8cd100a1.tar.bz2 interpreter-e3feb1a2ea12cd16db3e759c4aa6c05c8cd100a1.zip | |
Codegen: Support declaring functions multiple times
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index f312a0d..bcac597 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -570,25 +570,22 @@ pub const CodeGen = struct { }, .TYPE => |typ| { std.debug.assert(typ == .FUNCTION_TYPE); - const function_type = try self.get_llvm_type(expression); - const function = llvm.LLVMAddFunction(self.llvm_module, try std.fmt.allocPrintZ(self.arena, "{s}", .{name.?}), function_type); + std.debug.assert(self.environment.scope_stack.items.len == 1); - // Global functions - if (self.environment.scope_stack.items.len == 1) { - return try self.create_variable(.{ - .value = function, - .stack_level = null, - .node = expression, - .node_type = expression, - }); + const variable = self.environment.get_variable(name.?); + if (variable) |v| { + return v; } - const ptr = self.environment.get_variable(name.?); - _ = llvm.LLVMBuildStore(self.builder, function, ptr.?.value) orelse return CodeGenError.CompilationError; - ptr.?.node = expression; - ptr.?.node_type = expression; + const function_type = try self.get_llvm_type(expression); + const function = llvm.LLVMAddFunction(self.llvm_module, try std.fmt.allocPrintZ(self.arena, "{s}", .{name.?}), function_type); - return ptr.?; + return try self.create_variable(.{ + .value = function, + .stack_level = null, + .node = expression, + .node_type = expression, + }); }, else => unreachable, }; |