| ... | @@ -2204,28 +2204,29 @@ pub const Dir = struct { | ... | @@ -2204,28 +2204,29 @@ pub const Dir = struct { |
| 2204 | name: []const u8, | 2204 | name: []const u8, |
| 2205 | parent_dir: Dir, | 2205 | parent_dir: Dir, |
| 2206 | iter: IterableDir.Iterator, | 2206 | iter: IterableDir.Iterator, |
| 2207 | }; | | |
| 2208 | | 2207 | |
| 2209 | var stack = std.BoundedArray(StackItem, 16){}; | 2208 | fn closeAll(items: []@This()) void { |
| 2210 | defer { | 2209 | for (items) |*item| item.iter.dir.close(); |
| 2211 | for (stack.slice()) |*item| { | | |
| 2212 | item.iter.dir.close(); | | |
| 2213 | } | 2210 | } |
| 2214 | } | 2211 | }; |
| 2215 | | 2212 | |
| 2216 | stack.appendAssumeCapacity(StackItem{ | 2213 | var stack_buffer: [16]StackItem = undefined; |
| | 2214 | var stack = std.ArrayListUnmanaged(StackItem).initBuffer(&stack_buffer); |
| | 2215 | defer StackItem.closeAll(stack.items); |
| | 2216 | |
| | 2217 | stack.appendAssumeCapacity(.{ |
| 2217 | .name = sub_path, | 2218 | .name = sub_path, |
| 2218 | .parent_dir = self, | 2219 | .parent_dir = self, |
| 2219 | .iter = initial_iterable_dir.iterateAssumeFirstIteration(), | 2220 | .iter = initial_iterable_dir.iterateAssumeFirstIteration(), |
| 2220 | }); | 2221 | }); |
| 2221 | | 2222 | |
| 2222 | process_stack: while (stack.len != 0) { | 2223 | process_stack: while (stack.items.len != 0) { |
| 2223 | var top = &(stack.slice()[stack.len - 1]); | 2224 | var top = &stack.items[stack.items.len - 1]; |
| 2224 | while (try top.iter.next()) |entry| { | 2225 | while (try top.iter.next()) |entry| { |
| 2225 | var treat_as_dir = entry.kind == .directory; | 2226 | var treat_as_dir = entry.kind == .directory; |
| 2226 | handle_entry: while (true) { | 2227 | handle_entry: while (true) { |
| 2227 | if (treat_as_dir) { | 2228 | if (treat_as_dir) { |
| 2228 | if (stack.ensureUnusedCapacity(1)) { | 2229 | if (stack.unusedCapacitySlice().len >= 1) { |
| 2229 | var iterable_dir = top.iter.dir.openIterableDir(entry.name, .{ .no_follow = true }) catch |err| switch (err) { | 2230 | var iterable_dir = top.iter.dir.openIterableDir(entry.name, .{ .no_follow = true }) catch |err| switch (err) { |
| 2230 | error.NotDir => { | 2231 | error.NotDir => { |
| 2231 | treat_as_dir = false; | 2232 | treat_as_dir = false; |
| ... | @@ -2251,13 +2252,13 @@ pub const Dir = struct { | ... | @@ -2251,13 +2252,13 @@ pub const Dir = struct { |
| 2251 | error.DeviceBusy, | 2252 | error.DeviceBusy, |
| 2252 | => |e| return e, | 2253 | => |e| return e, |
| 2253 | }; | 2254 | }; |
| 2254 | stack.appendAssumeCapacity(StackItem{ | 2255 | stack.appendAssumeCapacity(.{ |
| 2255 | .name = entry.name, | 2256 | .name = entry.name, |
| 2256 | .parent_dir = top.iter.dir, | 2257 | .parent_dir = top.iter.dir, |
| 2257 | .iter = iterable_dir.iterateAssumeFirstIteration(), | 2258 | .iter = iterable_dir.iterateAssumeFirstIteration(), |
| 2258 | }); | 2259 | }); |
| 2259 | continue :process_stack; | 2260 | continue :process_stack; |
| 2260 | } else |_| { | 2261 | } else { |
| 2261 | try top.iter.dir.deleteTreeMinStackSizeWithKindHint(entry.name, entry.kind); | 2262 | try top.iter.dir.deleteTreeMinStackSizeWithKindHint(entry.name, entry.kind); |
| 2262 | break :handle_entry; | 2263 | break :handle_entry; |
| 2263 | } | 2264 | } |
| ... | @@ -2301,7 +2302,7 @@ pub const Dir = struct { | ... | @@ -2301,7 +2302,7 @@ pub const Dir = struct { |
| 2301 | // pop the value from the stack. | 2302 | // pop the value from the stack. |
| 2302 | const parent_dir = top.parent_dir; | 2303 | const parent_dir = top.parent_dir; |
| 2303 | const name = top.name; | 2304 | const name = top.name; |
| 2304 | _ = stack.pop(); | 2305 | stack.items.len -= 1; |
| 2305 | | 2306 | |
| 2306 | var need_to_retry: bool = false; | 2307 | var need_to_retry: bool = false; |
| 2307 | parent_dir.deleteDir(name) catch |err| switch (err) { | 2308 | parent_dir.deleteDir(name) catch |err| switch (err) { |
| ... | @@ -2374,7 +2375,7 @@ pub const Dir = struct { | ... | @@ -2374,7 +2375,7 @@ pub const Dir = struct { |
| 2374 | }; | 2375 | }; |
| 2375 | // We know there is room on the stack since we are just re-adding | 2376 | // We know there is room on the stack since we are just re-adding |
| 2376 | // the StackItem that we previously popped. | 2377 | // the StackItem that we previously popped. |
| 2377 | stack.appendAssumeCapacity(StackItem{ | 2378 | stack.appendAssumeCapacity(.{ |
| 2378 | .name = name, | 2379 | .name = name, |
| 2379 | .parent_dir = parent_dir, | 2380 | .parent_dir = parent_dir, |
| 2380 | .iter = iterable_dir.iterateAssumeFirstIteration(), | 2381 | .iter = iterable_dir.iterateAssumeFirstIteration(), |