| ... | @@ -2178,7 +2178,7 @@ pub const Dir = struct { | ... | @@ -2178,7 +2178,7 @@ pub const Dir = struct { |
| 2178 | }); | 2178 | }); |
| 2179 | continue :process_stack; | 2179 | continue :process_stack; |
| 2180 | } else |_| { | 2180 | } else |_| { |
| 2181 | try top.iter.dir.deleteTreeFallback(entry.name, entry.kind); | 2181 | try top.iter.dir.deleteTreeMinStackSizeWithKindHint(entry.name, entry.kind); |
| 2182 | break :handle_entry; | 2182 | break :handle_entry; |
| 2183 | } | 2183 | } |
| 2184 | } else { | 2184 | } else { |
| ... | @@ -2225,9 +2225,13 @@ pub const Dir = struct { | ... | @@ -2225,9 +2225,13 @@ pub const Dir = struct { |
| 2225 | } | 2225 | } |
| 2226 | } | 2226 | } |
| 2227 | | 2227 | |
| 2228 | /// Fallback version of deleteTree that is less efficient but works on arbitrarily | 2228 | /// Like `deleteTree`, but only keeps one `Iterator` active at a time to minimize the function's stack size. |
| 2229 | /// nested directories without needing recursion or allocation. | 2229 | /// This is slower than `deleteTree` but uses less stack space. |
| 2230 | fn deleteTreeFallback(self: Dir, sub_path: []const u8, kind_hint: File.Kind) DeleteTreeError!void { | 2230 | pub fn deleteTreeMinStackSize(self: Dir, sub_path: []const u8) DeleteTreeError!void { |
| | 2231 | return self.deleteTreeMinStackWithKindHint(sub_path, .File); |
| | 2232 | } |
| | 2233 | |
| | 2234 | fn deleteTreeMinStackSizeWithKindHint(self: Dir, sub_path: []const u8, kind_hint: File.Kind) DeleteTreeError!void { |
| 2231 | start_over: while (true) { | 2235 | start_over: while (true) { |
| 2232 | var iterable_dir = iterable_dir: { | 2236 | var iterable_dir = iterable_dir: { |
| 2233 | var treat_as_dir = kind_hint == .Directory; | 2237 | var treat_as_dir = kind_hint == .Directory; |