From e3feb1a2ea12cd16db3e759c4aa6c05c8cd100a1 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Sat, 10 May 2025 19:59:33 +0200 Subject: Codegen: Support declaring functions multiple times --- src/codegen.zig | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) (limited to 'src/codegen.zig') 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, }; -- cgit 1.4.1