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