aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-05-05 19:13:43 -0700
committerAndrew Kelley <andrew@ziglang.org>2023-06-10 20:42:29 -0700
commit31aee50c1a96b7e72b42ee885636b27fbcac8eb4 (patch)
treeddd17a80a48fa620a6d4cea9d8f6a970eb90845d /src/type.zig
parent08e97639513f09e2797bd7afcdfdfecdad6c6fd8 (diff)
downloadzig-31aee50c1a96b7e72b42ee885636b27fbcac8eb4.tar.gz
zig-31aee50c1a96b7e72b42ee885636b27fbcac8eb4.zip
InternPool: add a slice encoding
This uses the data field to reference its pointer field type, which allows for efficient and infallible access of a slice type's pointer type.
Diffstat (limited to 'src/type.zig')
-rw-r--r--src/type.zig66
1 files changed, 40 insertions, 26 deletions
diff --git a/src/type.zig b/src/type.zig
index a51ae273c1..dac12aa74e 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -2042,7 +2042,18 @@ pub const Type = struct {
else => unreachable,
},
else => switch (mod.intern_pool.indexToKey(ty.ip_index)) {
- else => @panic("TODO"),
+ .ptr_type => |ptr_type| {
+ if (ptr_type.alignment != 0) {
+ return @intCast(u32, ptr_type.alignment);
+ } else if (opt_sema) |sema| {
+ const res = try ptr_type.elem_type.toType().abiAlignmentAdvanced(mod, .{ .sema = sema });
+ return res.scalar;
+ } else {
+ return (ptr_type.elem_type.toType().abiAlignmentAdvanced(mod, .eager) catch unreachable).scalar;
+ }
+ },
+ .opt_type => |child| return child.toType().ptrAlignmentAdvanced(mod, opt_sema),
+ else => unreachable,
},
}
}
@@ -3060,33 +3071,36 @@ pub const Type = struct {
pointer: Payload.Pointer,
};
- pub fn slicePtrFieldType(self: Type, buffer: *SlicePtrFieldTypeBuffer) Type {
- switch (self.tag()) {
- .pointer => {
- const payload = self.castTag(.pointer).?.data;
- assert(payload.size == .Slice);
-
- buffer.* = .{
- .pointer = .{
- .data = .{
- .pointee_type = payload.pointee_type,
- .sentinel = payload.sentinel,
- .@"align" = payload.@"align",
- .@"addrspace" = payload.@"addrspace",
- .bit_offset = payload.bit_offset,
- .host_size = payload.host_size,
- .vector_index = payload.vector_index,
- .@"allowzero" = payload.@"allowzero",
- .mutable = payload.mutable,
- .@"volatile" = payload.@"volatile",
- .size = .Many,
+ pub fn slicePtrFieldType(ty: Type, buffer: *SlicePtrFieldTypeBuffer, mod: *const Module) Type {
+ switch (ty.ip_index) {
+ .none => switch (ty.tag()) {
+ .pointer => {
+ const payload = ty.castTag(.pointer).?.data;
+ assert(payload.size == .Slice);
+
+ buffer.* = .{
+ .pointer = .{
+ .data = .{
+ .pointee_type = payload.pointee_type,
+ .sentinel = payload.sentinel,
+ .@"align" = payload.@"align",
+ .@"addrspace" = payload.@"addrspace",
+ .bit_offset = payload.bit_offset,
+ .host_size = payload.host_size,
+ .vector_index = payload.vector_index,
+ .@"allowzero" = payload.@"allowzero",
+ .mutable = payload.mutable,
+ .@"volatile" = payload.@"volatile",
+ .size = .Many,
+ },
},
- },
- };
- return Type.initPayload(&buffer.pointer.base);
- },
+ };
+ return Type.initPayload(&buffer.pointer.base);
+ },
- else => unreachable,
+ else => unreachable,
+ },
+ else => return mod.intern_pool.slicePtrType(ty.ip_index).toType(),
}
}