authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-21 23:35:25 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-21 23:35:25 -07:00
logc452ffcce8cabc43f24045f0fb062bcd14700be6
tree4ce2582e9b74f71b30f53f0a37928d4178595b45
parent220ea9f68ae2fadb0ec3985228259467e001ba94
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

getTree: only recalculate MAL slice on list resize


1 files changed, 14 insertions(+), 4 deletions(-)

git.zig+14-4
......@@ -1196,10 +1196,12 @@ pub const Repository = struct {
11961196 }
11971197 if (try r.getObject(arena, id.id)) |obj| {
11981198 if (obj.type == .tree) {
1199 var children: std.MultiArrayList(Tree.Object) = .empty;
1199 const MAL = std.MultiArrayList(Tree.Object);
1200 var children: MAL = .empty;
12001201 errdefer children.deinit(r.gpa);
12011202 try children.ensureUnusedCapacity(r.gpa, 33);
12021203 var i: usize = 0;
1204 var slice = children.slice();
12031205 while (i < obj.content.len) {
12041206 const mode_end = std.mem.indexOfScalar(u8, obj.content[i..], ' ').?;
12051207 const mode = obj.content[i..][0..mode_end];
......@@ -1218,7 +1220,15 @@ pub const Repository = struct {
12181220 @memcpy(mode_buf[6 - mode.len ..], mode);
12191221 const mode_real = try parseTreeMode(&mode_buf);
12201222
1221 try children.append(r.gpa, .{
1223 const j = slice.len;
1224 if (j == slice.capacity) {
1225 @branchHint(.cold);
1226 try children.ensureUnusedCapacity(r.gpa, 1);
1227 slice = children.slice();
1228 }
1229 children.len += 1;
1230 slice.len += 1;
1231 slice.set(j, .{
12221232 .mode = mode_real,
12231233 .name = name,
12241234 .id = switch (mode_real.type) {
......@@ -1232,7 +1242,7 @@ pub const Repository = struct {
12321242 }
12331243
12341244 const S = struct {
1235 list: *std.MultiArrayList(Tree.Object),
1245 list: *MAL,
12361246
12371247 pub fn lessThan(s: @This(), a: usize, b: usize) bool {
12381248 const items = s.list.items(.name);
......@@ -1241,7 +1251,7 @@ pub const Repository = struct {
12411251 pub fn swap(s: @This(), a: usize, b: usize) void {
12421252 // Remove after updating to Zig 0.17. Ref: https://codeberg.org/ziglang/zig/pulls/32016
12431253 inline for (@typeInfo(Tree.Object).@"struct".fields) |field| {
1244 const its = s.list.items(@field(std.MultiArrayList(Tree.Object).Field, field.name));
1254 const its = s.list.items(@field(MAL.Field, field.name));
12451255 std.mem.swap(@FieldType(Tree.Object, field.name), &its[a], &its[b]);
12461256 }
12471257 }