diff --git a/src/InternPool.zig b/src/InternPool.zig index 37ff1352a7..4dba928d18 100644 --- a/src/InternPool.zig +++ b/src/InternPool.zig @@ -8030,6 +8030,8 @@ fn finishFuncInstance( decl.name = try ip.getOrPutStringFmt(gpa, tid, "{}__anon_{d}", .{ fn_owner_decl.name.fmt(ip), @intFromEnum(decl_index), }, .no_embedded_nulls); + decl.fqn = try ip.namespacePtr(fn_owner_decl.src_namespace) + .internFullyQualifiedName(ip, gpa, tid, decl.name); } pub const EnumTypeInit = struct { diff --git a/src/Sema.zig b/src/Sema.zig index bcae820148..1c48516476 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -9737,9 +9737,6 @@ fn funcCommon( .generic_owner = sema.generic_owner, .comptime_args = sema.comptime_args, }); - const func_decl = mod.declPtr(ip.indexToKey(func_index).func.owner_decl); - func_decl.fqn = - try ip.namespacePtr(func_decl.src_namespace).internFullyQualifiedName(pt, func_decl.name); return finishFunc( sema, block, diff --git a/src/Type.zig b/src/Type.zig index bea0474e9a..65176e9a80 100644 --- a/src/Type.zig +++ b/src/Type.zig @@ -337,7 +337,7 @@ pub fn print(ty: Type, writer: anytype, pt: Zcu.PerThread) @TypeOf(writer).Error try writer.print("{}", .{decl.fqn.fmt(ip)}); } else if (ip.loadStructType(ty.toIntern()).namespace.unwrap()) |namespace_index| { const namespace = mod.namespacePtr(namespace_index); - try namespace.renderFullyQualifiedName(mod, .empty, writer); + try namespace.renderFullyQualifiedName(ip, .empty, writer); } else { try writer.writeAll("@TypeOf(.{})"); } diff --git a/src/Zcu.zig b/src/Zcu.zig index 5dcda2ea86..a5de69fb62 100644 --- a/src/Zcu.zig +++ b/src/Zcu.zig @@ -628,23 +628,27 @@ pub const Namespace = struct { return zcu.fileByIndex(ns.file_scope); } + pub fn fileScopeIp(ns: Namespace, ip: *InternPool) *File { + return ip.filePtr(ns.file_scope); + } + // This renders e.g. "std.fs.Dir.OpenOptions" pub fn renderFullyQualifiedName( ns: Namespace, - zcu: *Zcu, + ip: *InternPool, name: InternPool.NullTerminatedString, writer: anytype, ) @TypeOf(writer).Error!void { if (ns.parent.unwrap()) |parent| { - try zcu.namespacePtr(parent).renderFullyQualifiedName( - zcu, - zcu.declPtr(ns.decl_index).name, + try ip.namespacePtr(parent).renderFullyQualifiedName( + ip, + ip.declPtr(ns.decl_index).name, writer, ); } else { - try ns.fileScope(zcu).renderFullyQualifiedName(writer); + try ns.fileScopeIp(ip).renderFullyQualifiedName(writer); } - if (name != .empty) try writer.print(".{}", .{name.fmt(&zcu.intern_pool)}); + if (name != .empty) try writer.print(".{}", .{name.fmt(ip)}); } /// This renders e.g. "std/fs.zig:Dir.OpenOptions" @@ -670,44 +674,43 @@ pub const Namespace = struct { pub fn internFullyQualifiedName( ns: Namespace, - pt: Zcu.PerThread, + ip: *InternPool, + gpa: Allocator, + tid: Zcu.PerThread.Id, name: InternPool.NullTerminatedString, ) !InternPool.NullTerminatedString { - const zcu = pt.zcu; - const ip = &zcu.intern_pool; - - const gpa = zcu.gpa; - const strings = ip.getLocal(pt.tid).getMutableStrings(gpa); + const strings = ip.getLocal(tid).getMutableStrings(gpa); // Protects reads of interned strings from being reallocated during the call to // renderFullyQualifiedName. const slice = try strings.addManyAsSlice(count: { var count: usize = name.length(ip) + 1; var cur_ns = &ns; while (true) { - const decl = zcu.declPtr(cur_ns.decl_index); - cur_ns = zcu.namespacePtr(cur_ns.parent.unwrap() orelse { - count += ns.fileScope(zcu).fullyQualifiedNameLen(); + const decl = ip.declPtr(cur_ns.decl_index); + cur_ns = ip.namespacePtr(cur_ns.parent.unwrap() orelse { + count += ns.fileScopeIp(ip).fullyQualifiedNameLen(); break :count count; }); count += decl.name.length(ip) + 1; } }); var fbs = std.io.fixedBufferStream(slice[0]); - ns.renderFullyQualifiedName(zcu, name, fbs.writer()) catch unreachable; + ns.renderFullyQualifiedName(ip, name, fbs.writer()) catch unreachable; assert(fbs.pos == slice[0].len); // Sanitize the name for nvptx which is more restrictive. // TODO This should be handled by the backend, not the frontend. Have a // look at how the C backend does it for inspiration. - const cpu_arch = zcu.root_mod.resolved_target.result.cpu.arch; - if (cpu_arch.isNvptx()) { - for (slice[0]) |*byte| switch (byte.*) { - '{', '}', '*', '[', ']', '(', ')', ',', ' ', '\'' => byte.* = '_', - else => {}, - }; - } + // FIXME This has bitrotted and is no longer able to be implemented here. + //const cpu_arch = zcu.root_mod.resolved_target.result.cpu.arch; + //if (cpu_arch.isNvptx()) { + // for (slice[0]) |*byte| switch (byte.*) { + // '{', '}', '*', '[', ']', '(', ')', ',', ' ', '\'' => byte.* = '_', + // else => {}, + // }; + //} - return ip.getOrPutTrailingString(gpa, pt.tid, @intCast(slice[0].len), .no_embedded_nulls); + return ip.getOrPutTrailingString(gpa, tid, @intCast(slice[0].len), .no_embedded_nulls); } pub fn getType(ns: Namespace, zcu: *Zcu) Type { diff --git a/src/Zcu/PerThread.zig b/src/Zcu/PerThread.zig index 48559b81f1..03d9b08261 100644 --- a/src/Zcu/PerThread.zig +++ b/src/Zcu/PerThread.zig @@ -1896,7 +1896,7 @@ const ScanDeclIter = struct { const was_exported = decl.is_exported; assert(decl.kind == kind); // ZIR tracking should preserve this decl.name = decl_name; - decl.fqn = try namespace.internFullyQualifiedName(pt, decl_name); + decl.fqn = try namespace.internFullyQualifiedName(ip, gpa, pt.tid, decl_name); decl.is_pub = declaration.flags.is_pub; decl.is_exported = declaration.flags.is_export; break :decl_index .{ was_exported, decl_index }; @@ -1906,7 +1906,7 @@ const ScanDeclIter = struct { const new_decl = zcu.declPtr(new_decl_index); new_decl.kind = kind; new_decl.name = decl_name; - new_decl.fqn = try namespace.internFullyQualifiedName(pt, decl_name); + new_decl.fqn = try namespace.internFullyQualifiedName(ip, gpa, pt.tid, decl_name); new_decl.is_pub = declaration.flags.is_pub; new_decl.is_exported = declaration.flags.is_export; new_decl.zir_decl_index = tracked_inst.toOptional(); @@ -2279,8 +2279,8 @@ pub fn initNewAnonDecl( const new_decl = pt.zcu.declPtr(new_decl_index); new_decl.name = name; - new_decl.fqn = fqn.unwrap() orelse - try pt.zcu.namespacePtr(new_decl.src_namespace).internFullyQualifiedName(pt, name); + new_decl.fqn = fqn.unwrap() orelse try pt.zcu.namespacePtr(new_decl.src_namespace) + .internFullyQualifiedName(&pt.zcu.intern_pool, pt.zcu.gpa, pt.tid, name); new_decl.val = val; new_decl.alignment = .none; new_decl.@"linksection" = .none;