diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2023-05-05 19:13:43 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2023-06-10 20:42:29 -0700 |
| commit | 31aee50c1a96b7e72b42ee885636b27fbcac8eb4 (patch) | |
| tree | ddd17a80a48fa620a6d4cea9d8f6a970eb90845d /src/type.zig | |
| parent | 08e97639513f09e2797bd7afcdfdfecdad6c6fd8 (diff) | |
| download | zig-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.zig | 66 |
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(), } } |
