diff options
| author | SuperAuguste <19855629+SuperAuguste@users.noreply.github.com> | 2023-12-10 05:10:58 -0500 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2024-01-29 13:09:17 -0800 |
| commit | a479fd313248a55273a17de5f9af6b82abdb0be4 (patch) | |
| tree | bef7ec6d1fd27407f18f19f3dde973ff639da507 /src/value.zig | |
| parent | f4f8036ec048daa072c7caa72edd320c85bf426c (diff) | |
| download | zig-a479fd313248a55273a17de5f9af6b82abdb0be4.tar.gz zig-a479fd313248a55273a17de5f9af6b82abdb0be4.zip | |
Fix some comptime packed struct issues
Co-authored-by: Veikka Tuominen <git@vexu.eu>
Diffstat (limited to 'src/value.zig')
| -rw-r--r-- | src/value.zig | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/value.zig b/src/value.zig index 69ddb56b8f..9bcfad18e1 100644 --- a/src/value.zig +++ b/src/value.zig @@ -847,16 +847,23 @@ pub const Value = struct { // and Extern is handled in non-packed writeToMemory. assert(struct_type.layout == .Packed); var bits: u16 = 0; - const storage = ip.indexToKey(val.toIntern()).aggregate.storage; for (0..struct_type.field_types.len) |i| { + const field_val = switch (val.ip_index) { + .none => switch (val.tag()) { + .bytes => unreachable, + .aggregate => val.castTag(.aggregate).?.data[i], + .repeated => val.castTag(.repeated).?.data, + else => unreachable, + }, + else => Value.fromInterned(switch (ip.indexToKey(val.toIntern()).aggregate.storage) { + .bytes => unreachable, + .elems => |elems| elems[i], + .repeated_elem => |elem| elem, + }), + }; const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]); const field_bits: u16 = @intCast(field_ty.bitSize(mod)); - const field_val = switch (storage) { - .bytes => unreachable, - .elems => |elems| elems[i], - .repeated_elem => |elem| elem, - }; - try Value.fromInterned(field_val).writeToPackedMemory(field_ty, mod, buffer, bit_offset + bits); + try field_val.writeToPackedMemory(field_ty, mod, buffer, bit_offset + bits); bits += field_bits; } }, |
