authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-21 18:32:01-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-22 11:32:14-07:00
log7b3556a8cff1edb63a331c5068902254b0b2126c
treefde806d25ef94b0d35dda421a1a491d5e268cf4a
parentf6549a956d640c1de2dc99340582950f9dc18c60

std.fs: make deleteTree use ArrayList instead of BoundedArray

We definitely want ArrayList in the standard library. Do we want BoundedArray? Maybe, maybe not. But that makes ArrayList a more stable dependency for std.fs.

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

lib/std/fs.zig+15-14
......@@ -2204,28 +2204,29 @@ pub const Dir = struct {
22042204 name: []const u8,
22052205 parent_dir: Dir,
22062206 iter: IterableDir.Iterator,
2207 };
22082207
2209 var stack = std.BoundedArray(StackItem, 16){};
2210 defer {
2211 for (stack.slice()) |*item| {
2212 item.iter.dir.close();
2208 fn closeAll(items: []@This()) void {
2209 for (items) |*item| item.iter.dir.close();
22132210 }
2214 }
2211 };
22152212
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(.{
22172218 .name = sub_path,
22182219 .parent_dir = self,
22192220 .iter = initial_iterable_dir.iterateAssumeFirstIteration(),
22202221 });
22212222
2222 process_stack: while (stack.len != 0) {
2223 var top = &(stack.slice()[stack.len - 1]);
2223 process_stack: while (stack.items.len != 0) {
2224 var top = &stack.items[stack.items.len - 1];
22242225 while (try top.iter.next()) |entry| {
22252226 var treat_as_dir = entry.kind == .directory;
22262227 handle_entry: while (true) {
22272228 if (treat_as_dir) {
2228 if (stack.ensureUnusedCapacity(1)) {
2229 if (stack.unusedCapacitySlice().len >= 1) {
22292230 var iterable_dir = top.iter.dir.openIterableDir(entry.name, .{ .no_follow = true }) catch |err| switch (err) {
22302231 error.NotDir => {
22312232 treat_as_dir = false;
......@@ -2251,13 +2252,13 @@ pub const Dir = struct {
22512252 error.DeviceBusy,
22522253 => |e| return e,
22532254 };
2254 stack.appendAssumeCapacity(StackItem{
2255 stack.appendAssumeCapacity(.{
22552256 .name = entry.name,
22562257 .parent_dir = top.iter.dir,
22572258 .iter = iterable_dir.iterateAssumeFirstIteration(),
22582259 });
22592260 continue :process_stack;
2260 } else |_| {
2261 } else {
22612262 try top.iter.dir.deleteTreeMinStackSizeWithKindHint(entry.name, entry.kind);
22622263 break :handle_entry;
22632264 }
......@@ -2301,7 +2302,7 @@ pub const Dir = struct {
23012302 // pop the value from the stack.
23022303 const parent_dir = top.parent_dir;
23032304 const name = top.name;
2304 _ = stack.pop();
2305 stack.items.len -= 1;
23052306
23062307 var need_to_retry: bool = false;
23072308 parent_dir.deleteDir(name) catch |err| switch (err) {
......@@ -2374,7 +2375,7 @@ pub const Dir = struct {
23742375 };
23752376 // We know there is room on the stack since we are just re-adding
23762377 // the StackItem that we previously popped.
2377 stack.appendAssumeCapacity(StackItem{
2378 stack.appendAssumeCapacity(.{
23782379 .name = name,
23792380 .parent_dir = parent_dir,
23802381 .iter = iterable_dir.iterateAssumeFirstIteration(),