r249830 - [VFS] Just normalize away .. and . in paths for in-memory file systems.
Benjamin Kramer via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 9 06:03:22 PDT 2015
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) {
More information about the cfe-commits
mailing list