aboutsummaryrefslogtreecommitdiff
path: root/src/value.zig
diff options
context:
space:
mode:
authorSuperAuguste <19855629+SuperAuguste@users.noreply.github.com>2023-12-10 05:10:58 -0500
committerAndrew Kelley <andrew@ziglang.org>2024-01-29 13:09:17 -0800
commita479fd313248a55273a17de5f9af6b82abdb0be4 (patch)
treebef7ec6d1fd27407f18f19f3dde973ff639da507 /src/value.zig
parentf4f8036ec048daa072c7caa72edd320c85bf426c (diff)
downloadzig-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.zig21
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;
}
},