[PATCH] D51359: Adding HardLink Support to VirtualFileSystem.
Ilya Biryukov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 29 11:07:26 PDT 2018
ilya-biryukov added a comment.
Could we try removing `Status` from the base class and move it into `InMemoryFile` and `InMemoryDir`?
It shouldn't be too much work and would give safer interfaces for our new hierarchy.
================
Comment at: lib/Basic/VirtualFileSystem.cpp:470
-enum InMemoryNodeKind { IME_File, IME_Directory };
+enum InMemoryNodeKind { IME_File, IME_Directory, IME_HARD_LINK };
----------------
NIT: maybe use a name that follow the naming style for the other node kinds, i.e. IME_HardLink?
================
Comment at: lib/Basic/VirtualFileSystem.cpp:526
+ InMemoryNode *ResolvedNode;
+ StringRef Name;
+
----------------
Can we get away without storing `Name`? `toString()` can just say `"hard link to " + ResolveNode->toString()`
================
Comment at: lib/Basic/VirtualFileSystem.cpp:529
+public:
+ InMemoryHardLink(Status Stat, InMemoryNode *ResolvedNode)
+ : InMemoryNode(std::move(Stat), IME_HARD_LINK),
----------------
Why do we need the Stat?
We can get it from `ResolveNode` if we want to store a copy. Any reason why it would be different?
================
Comment at: lib/Basic/VirtualFileSystem.cpp:529
+public:
+ InMemoryHardLink(Status Stat, InMemoryNode *ResolvedNode)
+ : InMemoryNode(std::move(Stat), IME_HARD_LINK),
----------------
ilya-biryukov wrote:
> Why do we need the Stat?
> We can get it from `ResolveNode` if we want to store a copy. Any reason why it would be different?
ResolveNode can't be `null`, right? Maybe use a reference instead?
Also, maybe make it const?
================
Comment at: lib/Basic/VirtualFileSystem.cpp:535
+ InMemoryNode *getResolvedNode() { return ResolvedNode; }
+ llvm::MemoryBuffer *getBuffer() {
+ return static_cast<InMemoryFile *>(ResolvedNode)->getBuffer();
----------------
Could we inline `getBuffer` and `getStatus`? Having the client code that's explicit about resolving the references seems like a good idea.
================
Comment at: lib/Basic/VirtualFileSystem.cpp:639
+ Optional<llvm::sys::fs::perms> Perms,
+ Optional<detail::InMemoryNode *> HardLink) {
SmallString<128> Path;
----------------
Why not just `InMemoryNode*`? Null would be the empty hardlink
================
Comment at: lib/Basic/VirtualFileSystem.cpp:782
+ // If Node is HardLink then return the resolved link.
+ if (auto File = dyn_cast<detail::InMemoryHardLink>(Node)) {
+ if (I == E)
----------------
NIT: maybe call the variable Link or HardLink?
Since it's not a file.
================
Comment at: unittests/Basic/VirtualFileSystemTest.cpp:1054
+ EXPECT_FALSE(FS.addHardLink(link, dir));
+}
+
----------------
Maybe also add a test that gets into hard links via directory iterators?
To make sure those give the same results as `openFileForRead`
Repository:
rC Clang
https://reviews.llvm.org/D51359
More information about the cfe-commits
mailing list