diff options
author | Jonas Devlieghere <jonas@devlieghere.com> | 2018-10-31 23:36:10 +0000 |
---|---|---|
committer | Jonas Devlieghere <jonas@devlieghere.com> | 2018-10-31 23:36:10 +0000 |
commit | 41fb951f874977f4c28c27797cd0693ee17c1b15 (patch) | |
tree | 95e7a689d405b73ddbdac134e398190bc43f92e5 /llvm/lib/Support/VirtualFileSystem.cpp | |
parent | e7c7934a11b18df4a26b55408c8f0ee481d177ca (diff) | |
download | llvm-41fb951f874977f4c28c27797cd0693ee17c1b15.zip llvm-41fb951f874977f4c28c27797cd0693ee17c1b15.tar.gz llvm-41fb951f874977f4c28c27797cd0693ee17c1b15.tar.bz2 |
[VFS] Add support for "no_push" to VFS recursive iterators.
The "regular" file system has a useful feature that makes it possible to
stop recursing when using the recursive directory iterators. This
functionality was missing for the VFS recursive iterator and this patch
adds that.
Differential revision: https://reviews.llvm.org/D53465
llvm-svn: 345793
Diffstat (limited to 'llvm/lib/Support/VirtualFileSystem.cpp')
-rw-r--r-- | llvm/lib/Support/VirtualFileSystem.cpp | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/llvm/lib/Support/VirtualFileSystem.cpp b/llvm/lib/Support/VirtualFileSystem.cpp index 81ac5bb..9440eac 100644 --- a/llvm/lib/Support/VirtualFileSystem.cpp +++ b/llvm/lib/Support/VirtualFileSystem.cpp @@ -2157,28 +2157,33 @@ vfs::recursive_directory_iterator::recursive_directory_iterator( : FS(&FS_) { directory_iterator I = FS->dir_begin(Path, EC); if (I != directory_iterator()) { - State = std::make_shared<IterState>(); - State->push(I); + State = std::make_shared<detail::RecDirIterState>(); + State->Stack.push(I); } } vfs::recursive_directory_iterator & recursive_directory_iterator::increment(std::error_code &EC) { - assert(FS && State && !State->empty() && "incrementing past end"); - assert(!State->top()->path().empty() && "non-canonical end iterator"); + assert(FS && State && !State->Stack.empty() && "incrementing past end"); + assert(!State->Stack.top()->path().empty() && "non-canonical end iterator"); vfs::directory_iterator End; - if (State->top()->type() == sys::fs::file_type::directory_file) { - vfs::directory_iterator I = FS->dir_begin(State->top()->path(), EC); - if (I != End) { - State->push(I); - return *this; + + if (State->HasNoPushRequest) + State->HasNoPushRequest = false; + else { + if (State->Stack.top()->type() == sys::fs::file_type::directory_file) { + vfs::directory_iterator I = FS->dir_begin(State->Stack.top()->path(), EC); + if (I != End) { + State->Stack.push(I); + return *this; + } } } - while (!State->empty() && State->top().increment(EC) == End) - State->pop(); + while (!State->Stack.empty() && State->Stack.top().increment(EC) == End) + State->Stack.pop(); - if (State->empty()) + if (State->Stack.empty()) State.reset(); // end iterator return *this; |