InternPool: implement extraStructType

This commit is contained in:
Andrew Kelley
2023-09-19 19:00:33 -07:00
parent fa1beba74f
commit b65f3d8826

View File

@@ -378,7 +378,7 @@ pub const Key = union(enum) {
runtime_order: RuntimeOrder.Slice,
comptime_bits: ComptimeBits,
offsets: Offsets,
names_map: MapIndex,
names_map: OptionalMapIndex,
pub const ComptimeBits = struct {
start: u32,
@@ -438,8 +438,8 @@ pub const Key = union(enum) {
/// Look up field index based on field name.
pub fn nameIndex(self: StructType, ip: *const InternPool, name: NullTerminatedString) ?u32 {
if (self.decl == .none) return null; // empty_struct_type
const map = &ip.maps.items[@intFromEnum(self.names_map)];
const names_map = self.names_map.unwrap() orelse return null;
const map = &ip.maps.items[@intFromEnum(names_map)];
const adapter: NullTerminatedString.Adapter = .{ .strings = self.field_names.get(ip) };
const field_index = map.getIndexAdapted(name, adapter) orelse return null;
return @intCast(field_index);
@@ -451,7 +451,7 @@ pub const Key = union(enum) {
ip: *InternPool,
name: NullTerminatedString,
) ?u32 {
return ip.addFieldName(self.names_map, self.field_names.start, name);
return ip.addFieldName(self.names_map.unwrap().?, self.field_names.start, name);
}
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
}
fn extraStructType(ip: *const InternPool, extra_index: u32) Key.StructType {
_ = ip;
_ = extra_index;
@panic("TODO");
const s = ip.extraDataTrail(Tag.TypeStruct, extra_index);
const fields_len = s.data.fields_len;
var index = s.end;
const field_types = t: {
const types: Index.Slice = .{ .start = index, .len = fields_len };
index += fields_len;
break :t types;
};
const names_map, const field_names: NullTerminatedString.Slice = t: {
if (s.data.flags.is_tuple) break :t .{ .none, .{ .start = 0, .len = 0 } };
const names_map: MapIndex = @enumFromInt(ip.extra.items[index]);
index += 1;
const names: NullTerminatedString.Slice = .{ .start = index, .len = fields_len };
index += fields_len;
break :t .{ names_map.toOptional(), names };
};
const field_inits: Index.Slice = t: {
if (!s.data.flags.any_default_inits) break :t .{ .start = 0, .len = 0 };
const inits: Index.Slice = .{ .start = index, .len = fields_len };
index += fields_len;
break :t inits;
};
const namespace = t: {
if (!s.data.flags.has_namespace) break :t .none;
const namespace: Module.Namespace.Index = @enumFromInt(ip.extra.items[index]);
index += 1;
break :t namespace.toOptional();
};
const field_aligns: Alignment.Slice = t: {
if (!s.data.flags.any_aligned_fields) break :t .{ .start = 0, .len = 0 };
const len = (fields_len + 3) / 4;
const aligns: Alignment.Slice = .{ .start = index, .len = len };
index += len;
break :t aligns;
};
const comptime_bits: Key.StructType.ComptimeBits = t: {
if (!s.data.flags.any_comptime_fields) break :t .{ .start = 0, .len = 0 };
const len = (fields_len + 31) / 32;
const comptime_bits: Key.StructType.ComptimeBits = .{ .start = index, .len = len };
index += len;
break :t comptime_bits;
};
const runtime_order: Key.StructType.RuntimeOrder.Slice = t: {
if (s.data.flags.is_extern) break :t .{ .start = 0, .len = 0 };
const ro: Key.StructType.RuntimeOrder.Slice = .{ .start = index, .len = fields_len };
index += fields_len;
break :t ro;
};
const offsets = t: {
const offsets: Key.StructType.Offsets = .{ .start = index, .len = fields_len };
index += fields_len;
break :t offsets;
};
return .{
.extra_index = extra_index,
.decl = s.data.decl.toOptional(),
.zir_index = s.data.zir_index,
.layout = if (s.data.flags.is_extern) .Extern else .Auto,
.field_types = field_types,
.names_map = names_map,
.field_names = field_names,
.field_inits = field_inits,
.namespace = namespace,
.field_aligns = field_aligns,
.comptime_bits = comptime_bits,
.runtime_order = runtime_order,
.offsets = offsets,
};
}
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
.runtime_order = .{ .start = 0, .len = 0 },
.comptime_bits = .{ .start = 0, .len = 0 },
.offsets = .{ .start = 0, .len = 0 },
.names_map = type_struct_packed.data.names_map,
.names_map = type_struct_packed.data.names_map.toOptional(),
};
}