| ... | ... | @@ -378,7 +378,7 @@ pub const Key = union(enum) { |
| 378 | 378 | runtime_order: RuntimeOrder.Slice, |
| 379 | 379 | comptime_bits: ComptimeBits, |
| 380 | 380 | offsets: Offsets, |
| 381 | | names_map: MapIndex, |
| 381 | names_map: OptionalMapIndex, |
| 382 | 382 | |
| 383 | 383 | pub const ComptimeBits = struct { |
| 384 | 384 | start: u32, |
| ... | ... | @@ -438,8 +438,8 @@ pub const Key = union(enum) { |
| 438 | 438 | |
| 439 | 439 | /// Look up field index based on field name. |
| 440 | 440 | pub fn nameIndex(self: StructType, ip: *const InternPool, name: NullTerminatedString) ?u32 { |
| 441 | | if (self.decl == .none) return null; // empty_struct_type |
| 442 | | const map = &ip.maps.items[@intFromEnum(self.names_map)]; |
| 441 | const names_map = self.names_map.unwrap() orelse return null; |
| 442 | const map = &ip.maps.items[@intFromEnum(names_map)]; |
| 443 | 443 | const adapter: NullTerminatedString.Adapter = .{ .strings = self.field_names.get(ip) }; |
| 444 | 444 | const field_index = map.getIndexAdapted(name, adapter) orelse return null; |
| 445 | 445 | return @intCast(field_index); |
| ... | ... | @@ -451,7 +451,7 @@ pub const Key = union(enum) { |
| 451 | 451 | ip: *InternPool, |
| 452 | 452 | name: NullTerminatedString, |
| 453 | 453 | ) ?u32 { |
| 454 | | return ip.addFieldName(self.names_map, self.field_names.start, name); |
| 454 | return ip.addFieldName(self.names_map.unwrap().?, self.field_names.start, name); |
| 455 | 455 | } |
| 456 | 456 | |
| 457 | 457 | pub fn fieldAlign(s: @This(), ip: *const InternPool, i: usize) Alignment { |
| ... | ... | @@ -4027,9 +4027,76 @@ fn extraTypeTupleAnon(ip: *const InternPool, extra_index: u32) Key.AnonStructTyp |
| 4027 | 4027 | } |
| 4028 | 4028 | |
| 4029 | 4029 | fn extraStructType(ip: *const InternPool, extra_index: u32) Key.StructType { |
| 4030 | | _ = ip; |
| 4031 | | _ = extra_index; |
| 4032 | | @panic("TODO"); |
| 4030 | const s = ip.extraDataTrail(Tag.TypeStruct, extra_index); |
| 4031 | const fields_len = s.data.fields_len; |
| 4032 | |
| 4033 | var index = s.end; |
| 4034 | |
| 4035 | const field_types = t: { |
| 4036 | const types: Index.Slice = .{ .start = index, .len = fields_len }; |
| 4037 | index += fields_len; |
| 4038 | break :t types; |
| 4039 | }; |
| 4040 | const names_map, const field_names: NullTerminatedString.Slice = t: { |
| 4041 | if (s.data.flags.is_tuple) break :t .{ .none, .{ .start = 0, .len = 0 } }; |
| 4042 | const names_map: MapIndex = @enumFromInt(ip.extra.items[index]); |
| 4043 | index += 1; |
| 4044 | const names: NullTerminatedString.Slice = .{ .start = index, .len = fields_len }; |
| 4045 | index += fields_len; |
| 4046 | break :t .{ names_map.toOptional(), names }; |
| 4047 | }; |
| 4048 | const field_inits: Index.Slice = t: { |
| 4049 | if (!s.data.flags.any_default_inits) break :t .{ .start = 0, .len = 0 }; |
| 4050 | const inits: Index.Slice = .{ .start = index, .len = fields_len }; |
| 4051 | index += fields_len; |
| 4052 | break :t inits; |
| 4053 | }; |
| 4054 | const namespace = t: { |
| 4055 | if (!s.data.flags.has_namespace) break :t .none; |
| 4056 | const namespace: Module.Namespace.Index = @enumFromInt(ip.extra.items[index]); |
| 4057 | index += 1; |
| 4058 | break :t namespace.toOptional(); |
| 4059 | }; |
| 4060 | const field_aligns: Alignment.Slice = t: { |
| 4061 | if (!s.data.flags.any_aligned_fields) break :t .{ .start = 0, .len = 0 }; |
| 4062 | const len = (fields_len + 3) / 4; |
| 4063 | const aligns: Alignment.Slice = .{ .start = index, .len = len }; |
| 4064 | index += len; |
| 4065 | break :t aligns; |
| 4066 | }; |
| 4067 | const comptime_bits: Key.StructType.ComptimeBits = t: { |
| 4068 | if (!s.data.flags.any_comptime_fields) break :t .{ .start = 0, .len = 0 }; |
| 4069 | const len = (fields_len + 31) / 32; |
| 4070 | const comptime_bits: Key.StructType.ComptimeBits = .{ .start = index, .len = len }; |
| 4071 | index += len; |
| 4072 | break :t comptime_bits; |
| 4073 | }; |
| 4074 | const runtime_order: Key.StructType.RuntimeOrder.Slice = t: { |
| 4075 | if (s.data.flags.is_extern) break :t .{ .start = 0, .len = 0 }; |
| 4076 | const ro: Key.StructType.RuntimeOrder.Slice = .{ .start = index, .len = fields_len }; |
| 4077 | index += fields_len; |
| 4078 | break :t ro; |
| 4079 | }; |
| 4080 | const offsets = t: { |
| 4081 | const offsets: Key.StructType.Offsets = .{ .start = index, .len = fields_len }; |
| 4082 | index += fields_len; |
| 4083 | break :t offsets; |
| 4084 | }; |
| 4085 | return .{ |
| 4086 | .extra_index = extra_index, |
| 4087 | .decl = s.data.decl.toOptional(), |
| 4088 | .zir_index = s.data.zir_index, |
| 4089 | .layout = if (s.data.flags.is_extern) .Extern else .Auto, |
| 4090 | .field_types = field_types, |
| 4091 | .names_map = names_map, |
| 4092 | .field_names = field_names, |
| 4093 | .field_inits = field_inits, |
| 4094 | .namespace = namespace, |
| 4095 | .field_aligns = field_aligns, |
| 4096 | .comptime_bits = comptime_bits, |
| 4097 | .runtime_order = runtime_order, |
| 4098 | .offsets = offsets, |
| 4099 | }; |
| 4033 | 4100 | } |
| 4034 | 4101 | |
| 4035 | 4102 | fn extraPackedStructType(ip: *const InternPool, extra_index: u32, inits: bool) Key.StructType { |
| ... | ... | @@ -4060,7 +4127,7 @@ fn extraPackedStructType(ip: *const InternPool, extra_index: u32, inits: bool) K |
| 4060 | 4127 | .runtime_order = .{ .start = 0, .len = 0 }, |
| 4061 | 4128 | .comptime_bits = .{ .start = 0, .len = 0 }, |
| 4062 | 4129 | .offsets = .{ .start = 0, .len = 0 }, |
| 4063 | | .names_map = type_struct_packed.data.names_map, |
| 4130 | .names_map = type_struct_packed.data.names_map.toOptional(), |
| 4064 | 4131 | }; |
| 4065 | 4132 | } |
| 4066 | 4133 | |