From b6e6dfd8beca3636914d59e9a2c1c1233160e5c6 Mon Sep 17 00:00:00 2001 From: crschnick Date: Fri, 28 Nov 2025 03:34:00 +0000 Subject: [PATCH] Reduce stack overflow probability for dir traverse --- .../java/io/xpipe/app/ext/FileSystem.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/ext/FileSystem.java b/app/src/main/java/io/xpipe/app/ext/FileSystem.java index 41b924d6b..8e3e7a7ac 100644 --- a/app/src/main/java/io/xpipe/app/ext/FileSystem.java +++ b/app/src/main/java/io/xpipe/app/ext/FileSystem.java @@ -109,17 +109,28 @@ public interface FileSystem extends Closeable, AutoCloseable { base = filesStream.toList(); } - for (FileEntry fileEntry : base) { - if (!visitor.test(fileEntry)) { - return; - } + if (base.size() != 1) { + for (FileEntry fileEntry : base) { + if (!visitor.test(fileEntry)) { + continue; + } - if (fileEntry.getKind() != FileKind.DIRECTORY) { - continue; - } + if (fileEntry.getKind() != FileKind.DIRECTORY) { + continue; + } - traverseFilesRecursively(system, fileEntry.getPath(), visitor); + traverseFilesRecursively(system, fileEntry.getPath(), visitor); + } + return; } + + // Optimize this call to use tail recursion if possible + + if (!visitor.test(base.getFirst()) || base.getFirst().getKind() != FileKind.DIRECTORY) { + return; + } + + traverseFilesRecursively(system, base.getFirst().getPath(), visitor); } List listRoots() throws Exception;