Commit 43ad87555e

Simon Brown <si@sjbrown.co.uk>
2025-03-30 13:59:48
Add quota for comptime sort, add test
1 parent acfdad8
Changed files (1)
lib/std/multi_array_list.zig
@@ -170,6 +170,7 @@ pub fn MultiArrayList(comptime T: type) type {
                     return lhs.alignment > rhs.alignment;
                 }
             };
+            @setEvalBranchQuota(3 * fields.len * std.math.log2(fields.len));
             mem.sort(Data, &data, {}, Sort.lessThan);
             var sizes_bytes: [fields.len]usize = undefined;
             var field_indexes: [fields.len]usize = undefined;
@@ -978,3 +979,40 @@ test "0 sized struct" {
     list.swapRemove(list.len - 1);
     try testing.expectEqualSlices(u0, &[_]u0{0}, list.items(.a));
 }
+
+test "struct with many fields" {
+    const ManyFields = struct {
+        fn Type(count: comptime_int) type {
+            var fields: [count]std.builtin.Type.StructField = undefined;
+            for (0..count) |i| {
+                fields[i] = .{
+                    .name = std.fmt.comptimePrint("a{}", .{i}),
+                    .type = u32,
+                    .default_value_ptr = null,
+                    .is_comptime = false,
+                    .alignment = @alignOf(u32),
+                };
+            }
+            const info: std.builtin.Type = .{ .@"struct" = .{
+                .layout = .auto,
+                .fields = &fields,
+                .decls = &.{},
+                .is_tuple = false,
+            } };
+            return @Type(info);
+        }
+
+        fn doTest(ally: std.mem.Allocator, count: comptime_int) !void {
+            var list: MultiArrayList(Type(count)) = .empty;
+            defer list.deinit(ally);
+
+            try list.resize(ally, 1);
+            list.items(.a0)[0] = 42;
+        }
+    };
+
+    try ManyFields.doTest(testing.allocator, 25);
+    try ManyFields.doTest(testing.allocator, 50);
+    try ManyFields.doTest(testing.allocator, 100);
+    try ManyFields.doTest(testing.allocator, 200);
+}