authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-05-19 16:29:49-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-05-25 18:54:35-07:00
log5c133c5765f3c4e80d46c35c104edc23d883c60e
tree55508f176d2abcb8a963e7fa36e0d7aae6e63788
parentf414370fba47e375cc240f3fcaa8fa36c7c0fed3

Configuration: fix deserialization of LengthPrefixedList

don't assume only 1 field

2 files changed, 14 insertions(+), 9 deletions(-)

BRANCH_TODO+2-1
......@@ -1,4 +1,4 @@
1* WriteFile step failing when making langref
1* Run step getting wrong path_directory values
22* double check when targets get resolved (should be at configure time)
33* finish migrating the rest of the build steps
44* pass overridden pkg-dir to maker
......@@ -39,6 +39,7 @@
3939* WriteFiles: introduce Group
4040* re-examine the use case of adding file paths to Options steps
4141* extract the reusable Configure abstractions and reuse it for Zir etc
42* add the ability to delete files to UpdateSourceFiles
4243
4344## Already Filed Followup Issues
4445* build system fmt step with check=false does not acquire a write lock on source files #35204
lib/std/Build/Configuration.zig+12-8
......@@ -2545,8 +2545,10 @@ pub const Storage = enum {
25452545 };
25462546 }
25472547
2548 /// The field contains a u32 length followed by that many items, each
2549 /// element bitcastable to u32.
2548 /// The field contains a u32 length followed by that many items. Each
2549 /// element needs well-defined memory layout but can otherwise be any
2550 /// multiple of u32 length. The length is number of elements, not the
2551 /// number of u32s.
25502552 pub fn LengthPrefixedList(comptime ElemArg: type) type {
25512553 return struct {
25522554 slice: []const Elem,
......@@ -2759,19 +2761,21 @@ pub const Storage = enum {
27592761 },
27602762 .extended => @compileError("TODO"),
27612763 .length_prefixed_list => {
2764 const n = @divExact(@sizeOf(Field.Elem), @sizeOf(u32));
27622765 const data_start = i.* + 1;
2763 const len = buffer[data_start - 1];
2764 defer i.* = data_start + len;
2765 return .{ .slice = @ptrCast(buffer[data_start..][0..len]) };
2766 const buf_len = buffer[data_start - 1] * n;
2767 defer i.* = data_start + buf_len;
2768 return .{ .slice = @ptrCast(buffer[data_start..][0..buf_len]) };
27662769 },
27672770 .flag_length_prefixed_list => {
27682771 const flags = @field(container, @tagName(Field.flags));
27692772 const flag = @field(flags, @tagName(Field.flag));
27702773 if (!flag) return .{ .slice = &.{} };
2774 const n = @divExact(@sizeOf(Field.Elem), @sizeOf(u32));
27712775 const data_start = i.* + 1;
2772 const len = buffer[data_start - 1];
2773 defer i.* = data_start + len;
2774 return .{ .slice = @ptrCast(buffer[data_start..][0..len]) };
2776 const buf_len = buffer[data_start - 1] * n;
2777 defer i.* = data_start + buf_len;
2778 return .{ .slice = @ptrCast(buffer[data_start..][0..buf_len]) };
27752779 },
27762780 .flag_list => {
27772781 const flags = @field(container, @tagName(Field.flags));