authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-09-19 19:00:33-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-09-21 14:48:40-07:00
logb65f3d8826a71cf9e0603561ae9dfdbd501e05a9
tree50fdb745a2ec2d9f76185ce42dc69b291aa772db
parentfa1beba74fe2c5104bea16a90daa314ba713f287

InternPool: implement extraStructType


1 files changed, 75 insertions(+), 8 deletions(-)

src/InternPool.zig+75-8
......@@ -378,7 +378,7 @@ pub const Key = union(enum) {
378378 runtime_order: RuntimeOrder.Slice,
379379 comptime_bits: ComptimeBits,
380380 offsets: Offsets,
381 names_map: MapIndex,
381 names_map: OptionalMapIndex,
382382
383383 pub const ComptimeBits = struct {
384384 start: u32,
......@@ -438,8 +438,8 @@ pub const Key = union(enum) {
438438
439439 /// Look up field index based on field name.
440440 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)];
443443 const adapter: NullTerminatedString.Adapter = .{ .strings = self.field_names.get(ip) };
444444 const field_index = map.getIndexAdapted(name, adapter) orelse return null;
445445 return @intCast(field_index);
......@@ -451,7 +451,7 @@ pub const Key = union(enum) {
451451 ip: *InternPool,
452452 name: NullTerminatedString,
453453 ) ?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);
455455 }
456456
457457 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
40274027}
40284028
40294029fn 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 };
40334100}
40344101
40354102fn 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
40604127 .runtime_order = .{ .start = 0, .len = 0 },
40614128 .comptime_bits = .{ .start = 0, .len = 0 },
40624129 .offsets = .{ .start = 0, .len = 0 },
4063 .names_map = type_struct_packed.data.names_map,
4130 .names_map = type_struct_packed.data.names_map.toOptional(),
40644131 };
40654132}
40664133