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