Author: d0k Date: Fri Oct 9 08:03:22 2015 New Revision: 249830 URL: http://llvm.org/viewvc/llvm-project?rev=249830&view=rev Log: [VFS] Just normalize away .. and . in paths for in-memory file systems.
This simplifies the code and gets us support for .. for free. Modified: cfe/trunk/include/clang/Basic/VirtualFileSystem.h cfe/trunk/lib/Basic/VirtualFileSystem.cpp cfe/trunk/unittests/Basic/VirtualFileSystemTest.cpp Modified: cfe/trunk/include/clang/Basic/VirtualFileSystem.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/VirtualFileSystem.h?rev=249830&r1=249829&r2=249830&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/VirtualFileSystem.h (original) +++ cfe/trunk/include/clang/Basic/VirtualFileSystem.h Fri Oct 9 08:03:22 2015 @@ -283,7 +283,7 @@ public: /// Add a buffer to the VFS with a path. The VFS does not own the buffer. void addFileNoOwn(const Twine &Path, time_t ModificationTime, llvm::MemoryBuffer *Buffer); - StringRef toString() const; + std::string toString() const; llvm::ErrorOr<Status> status(const Twine &Path) override; llvm::ErrorOr<std::unique_ptr<File>> Modified: cfe/trunk/lib/Basic/VirtualFileSystem.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/VirtualFileSystem.cpp?rev=249830&r1=249829&r2=249830&view=diff ============================================================================== --- cfe/trunk/lib/Basic/VirtualFileSystem.cpp (original) +++ cfe/trunk/lib/Basic/VirtualFileSystem.cpp Fri Oct 9 08:03:22 2015 @@ -10,6 +10,7 @@ //===----------------------------------------------------------------------===// #include "clang/Basic/VirtualFileSystem.h" +#include "clang/Basic/FileManager.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringExtras.h" @@ -482,7 +483,7 @@ InMemoryFileSystem::InMemoryFileSystem() InMemoryFileSystem::~InMemoryFileSystem() {} -StringRef InMemoryFileSystem::toString() const { +std::string InMemoryFileSystem::toString() const { return Root->toString(/*Indent=*/0); } @@ -496,17 +497,14 @@ void InMemoryFileSystem::addFile(const T assert(!EC); (void)EC; + FileManager::removeDotPaths(Path, /*RemoveDotDot=*/true); + if (Path.empty()) + return; + detail::InMemoryDirectory *Dir = Root.get(); auto I = llvm::sys::path::begin(Path), E = llvm::sys::path::end(Path); while (true) { StringRef Name = *I; - // Skip over ".". - // FIXME: Also handle "..". - if (Name == ".") { - ++I; - continue; - } - detail::InMemoryNode *Node = Dir->getChild(Name); ++I; if (!Node) { @@ -558,17 +556,12 @@ lookupInMemoryNode(const InMemoryFileSys assert(!EC); (void)EC; + FileManager::removeDotPaths(Path, /*RemoveDotDot=*/true); + if (Path.empty()) + return Dir; + auto I = llvm::sys::path::begin(Path), E = llvm::sys::path::end(Path); while (true) { - // Skip over ".". - // FIXME: Also handle "..". - if (*I == ".") { - ++I; - if (I == E) - return Dir; - continue; - } - detail::InMemoryNode *Node = Dir->getChild(*I); ++I; if (!Node) Modified: cfe/trunk/unittests/Basic/VirtualFileSystemTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Basic/VirtualFileSystemTest.cpp?rev=249830&r1=249829&r2=249830&view=diff ============================================================================== --- cfe/trunk/unittests/Basic/VirtualFileSystemTest.cpp (original) +++ cfe/trunk/unittests/Basic/VirtualFileSystemTest.cpp Fri Oct 9 08:03:22 2015 @@ -569,6 +569,7 @@ TEST_F(InMemoryFileSystemTest, OverlayFi TEST_F(InMemoryFileSystemTest, OpenFileForRead) { FS.addFile("/a", 0, MemoryBuffer::getMemBuffer("a")); FS.addFile("././c", 0, MemoryBuffer::getMemBuffer("c")); + FS.addFile("./d/../d", 0, MemoryBuffer::getMemBuffer("d")); auto File = FS.openFileForRead("/a"); ASSERT_EQ("a", (*(*File)->getBuffer("ignored"))->getBuffer()); File = FS.openFileForRead("/a"); // Open again. @@ -581,6 +582,8 @@ TEST_F(InMemoryFileSystemTest, OpenFileF ASSERT_EQ(File.getError(), errc::no_such_file_or_directory) << FS.toString(); File = FS.openFileForRead("./c"); ASSERT_EQ("c", (*(*File)->getBuffer("ignored"))->getBuffer()); + File = FS.openFileForRead("e/../d"); + ASSERT_EQ("d", (*(*File)->getBuffer("ignored"))->getBuffer()); } TEST_F(InMemoryFileSystemTest, DirectoryIteration) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits