diff --git a/include/u-lang/Basic/VirtualFileSystem.hpp b/include/u-lang/Basic/VirtualFileSystem.hpp index 81814e5..2aeb776 100644 --- a/include/u-lang/Basic/VirtualFileSystem.hpp +++ b/include/u-lang/Basic/VirtualFileSystem.hpp @@ -471,9 +471,13 @@ class ConcatenatedOverlayFileSystem : public FileSystem /// their addition. FileSystemList FSList; + std::vector Cleanup; + public: explicit ConcatenatedOverlayFileSystem(IntrusiveRefCntPtr Base); + ~ConcatenatedOverlayFileSystem(); + /// \brief Pushes a file system on top of the stack. void pushOverlay(IntrusiveRefCntPtr FS); diff --git a/lib/Basic/VirtualFileSystem.cpp b/lib/Basic/VirtualFileSystem.cpp index 3b2e616..d55ad46 100644 --- a/lib/Basic/VirtualFileSystem.cpp +++ b/lib/Basic/VirtualFileSystem.cpp @@ -932,6 +932,14 @@ ConcatenatedOverlayFileSystem::ConcatenatedOverlayFileSystem(IntrusiveRefCntPtr< FSList.push_back(std::move(BaseFS)); } +ConcatenatedOverlayFileSystem::~ConcatenatedOverlayFileSystem() +{ + for (auto item : Cleanup) + { + delete reinterpret_cast(item); + } +} + void ConcatenatedOverlayFileSystem::pushOverlay(IntrusiveRefCntPtr FS) { @@ -1018,6 +1026,8 @@ ConcatenatedOverlayFileSystem::openFileForRead(const llvm::Twine& Path) auto* F = new detail::InMemoryFile(std::move(Stat), std::move(memoryBuffer)); + Cleanup.push_back(F); + return std::unique_ptr(new detail::InMemoryFileAdaptor(*F)); }