authorgravatar for si@sjbrown.co.ukSimon Brown <si@sjbrown.co.uk> 2025-03-30 12:59:48+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-03-31 17:52:16+02:00
loge5ea175ffb1a8339dd9169deebfacf4b943ddf72
tree91f60031b198e152f0de7323b24da182f5a56a09
parentaca8ed9deccda88c79daf31b9a427df8871ec3b3
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

Add quota for comptime sort, add test


1 files changed, 38 insertions(+), 0 deletions(-)

lib/std/multi_array_list.zig+38
......@@ -170,6 +170,7 @@ pub fn MultiArrayList(comptime T: type) type {
170170 return lhs.alignment > rhs.alignment;
171171 }
172172 };
173 @setEvalBranchQuota(3 * fields.len * std.math.log2(fields.len));
173174 mem.sort(Data, &data, {}, Sort.lessThan);
174175 var sizes_bytes: [fields.len]usize = undefined;
175176 var field_indexes: [fields.len]usize = undefined;
......@@ -978,3 +979,40 @@ test "0 sized struct" {
978979 list.swapRemove(list.len - 1);
979980 try testing.expectEqualSlices(u0, &[_]u0{0}, list.items(.a));
980981}
982
983test "struct with many fields" {
984 const ManyFields = struct {
985 fn Type(count: comptime_int) type {
986 var fields: [count]std.builtin.Type.StructField = undefined;
987 for (0..count) |i| {
988 fields[i] = .{
989 .name = std.fmt.comptimePrint("a{}", .{i}),
990 .type = u32,
991 .default_value_ptr = null,
992 .is_comptime = false,
993 .alignment = @alignOf(u32),
994 };
995 }
996 const info: std.builtin.Type = .{ .@"struct" = .{
997 .layout = .auto,
998 .fields = &fields,
999 .decls = &.{},
1000 .is_tuple = false,
1001 } };
1002 return @Type(info);
1003 }
1004
1005 fn doTest(ally: std.mem.Allocator, count: comptime_int) !void {
1006 var list: MultiArrayList(Type(count)) = .empty;
1007 defer list.deinit(ally);
1008
1009 try list.resize(ally, 1);
1010 list.items(.a0)[0] = 42;
1011 }
1012 };
1013
1014 try ManyFields.doTest(testing.allocator, 25);
1015 try ManyFields.doTest(testing.allocator, 50);
1016 try ManyFields.doTest(testing.allocator, 100);
1017 try ManyFields.doTest(testing.allocator, 200);
1018}