| ... | ... | @@ -57,7 +57,7 @@ unions_free_list: std.ArrayListUnmanaged(Module.Union.Index) = .{}, |
| 57 | 57 | /// to field index, or value to field index. In such cases, they will store the underlying |
| 58 | 58 | /// field names and values directly, relying on one of these maps, stored separately, |
| 59 | 59 | /// to provide lookup. |
| 60 | | maps: std.ArrayListUnmanaged(std.AutoArrayHashMapUnmanaged(void, void)) = .{}, |
| 60 | maps: std.ArrayListUnmanaged(FieldMap) = .{}, |
| 61 | 61 | |
| 62 | 62 | /// Used for finding the index inside `string_bytes`. |
| 63 | 63 | string_table: std.HashMapUnmanaged( |
| ... | ... | @@ -67,6 +67,10 @@ string_table: std.HashMapUnmanaged( |
| 67 | 67 | std.hash_map.default_max_load_percentage, |
| 68 | 68 | ) = .{}, |
| 69 | 69 | |
| 70 | /// TODO: after https://github.com/ziglang/zig/issues/10618 is solved, |
| 71 | /// change store_hash to false. |
| 72 | const FieldMap = std.ArrayHashMapUnmanaged(void, void, std.array_hash_map.AutoContext(void), true); |
| 73 | |
| 70 | 74 | const builtin = @import("builtin"); |
| 71 | 75 | const std = @import("std"); |
| 72 | 76 | const Allocator = std.mem.Allocator; |
| ... | ... | @@ -301,7 +305,7 @@ pub const Key = union(enum) { |
| 301 | 305 | const map = &ip.maps.items[@intFromEnum(self.names_map.unwrap().?)]; |
| 302 | 306 | const adapter: NullTerminatedString.Adapter = .{ .strings = self.names.get(ip) }; |
| 303 | 307 | const field_index = map.getIndexAdapted(name, adapter) orelse return null; |
| 304 | | return @as(u32, @intCast(field_index)); |
| 308 | return @intCast(field_index); |
| 305 | 309 | } |
| 306 | 310 | }; |
| 307 | 311 | |
| ... | ... | @@ -4627,9 +4631,11 @@ pub fn getErrorSetType( |
| 4627 | 4631 | const prev_extra_len = ip.extra.items.len; |
| 4628 | 4632 | errdefer ip.extra.items.len = prev_extra_len; |
| 4629 | 4633 | |
| 4634 | const predicted_names_map: MapIndex = @enumFromInt(ip.maps.items.len); |
| 4635 | |
| 4630 | 4636 | const error_set_extra_index = ip.addExtraAssumeCapacity(Tag.ErrorSet{ |
| 4631 | 4637 | .names_len = @intCast(names.len), |
| 4632 | | .names_map = @enumFromInt(ip.maps.items.len), |
| 4638 | .names_map = predicted_names_map, |
| 4633 | 4639 | }); |
| 4634 | 4640 | ip.extra.appendSliceAssumeCapacity(@ptrCast(names)); |
| 4635 | 4641 | |
| ... | ... | @@ -4650,8 +4656,10 @@ pub fn getErrorSetType( |
| 4650 | 4656 | }); |
| 4651 | 4657 | errdefer ip.items.len -= 1; |
| 4652 | 4658 | |
| 4653 | | _ = try ip.addMap(gpa); |
| 4654 | | errdefer @compileError("don't"); |
| 4659 | const names_map = try ip.addMap(gpa); |
| 4660 | errdefer _ = ip.maps.pop(); |
| 4661 | |
| 4662 | try addStringsToMap(ip, gpa, names_map, names); |
| 4655 | 4663 | |
| 4656 | 4664 | return @enumFromInt(ip.items.len - 1); |
| 4657 | 4665 | } |