diff options
author | Alberto Sartori <alberto.sartori@huawei.com> | 2022-04-26 12:23:56 +0200 |
---|---|---|
committer | Alberto Sartori <alberto.sartori@huawei.com> | 2022-04-26 13:44:00 +0200 |
commit | 233a5c2dd1bf7275a6c0217b25073acdaee39a63 (patch) | |
tree | 38fdbe8e5f6bc6f425781eeb6b8c12264bbee55e /src | |
parent | 4b5dfcecac43e14e57f76993f2431bae5f1866f3 (diff) | |
download | justbuild-233a5c2dd1bf7275a6c0217b25073acdaee39a63.tar.gz |
bug fix: FileRoot::DirectoryEntries cannot hold std::monostate anymore
DirectoryEntries must be constructed explicitly either via a GitTree*
or an unordered_map<string,ObjectType>. So, the case of an empty
directory, is represented by an empty map. Before this patch, empty
directories were represented by std::monostate and missing checks
on that led to a seg-fault.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/build_engine/base_maps/directory_map.cpp | 3 | ||||
-rw-r--r-- | src/buildtool/file_system/file_root.hpp | 11 |
2 files changed, 8 insertions, 6 deletions
diff --git a/src/buildtool/build_engine/base_maps/directory_map.cpp b/src/buildtool/build_engine/base_maps/directory_map.cpp index 1b862386..b8cc4441 100644 --- a/src/buildtool/build_engine/base_maps/directory_map.cpp +++ b/src/buildtool/build_engine/base_maps/directory_map.cpp @@ -25,7 +25,8 @@ auto BuildMaps::Base::CreateDirectoryEntriesMap(std::size_t jobs) if (not ws_root->IsDirectory(key.module)) { // Missing directory is fine (source tree might be incomplete), // contains no entries. - (*setter)(FileRoot::DirectoryEntries{}); + (*setter)(FileRoot::DirectoryEntries{ + FileRoot::DirectoryEntries::pairs_t{}}); return; } (*setter)(ws_root->ReadDirectory(key.module)); diff --git a/src/buildtool/file_system/file_root.hpp b/src/buildtool/file_system/file_root.hpp index c374e937..66ceb68a 100644 --- a/src/buildtool/file_system/file_root.hpp +++ b/src/buildtool/file_system/file_root.hpp @@ -84,9 +84,11 @@ class FileRoot { public: class DirectoryEntries { friend class FileRoot; + + public: using pairs_t = std::unordered_map<std::string, ObjectType>; using tree_t = gsl::not_null<GitTree const*>; - using entries_t = std::variant<std::monostate, tree_t, pairs_t>; + using entries_t = std::variant<tree_t, pairs_t>; using fs_iterator_type = typename pairs_t::const_iterator; using fs_iterator = FilteredIterator<fs_iterator_type>; @@ -94,6 +96,7 @@ class FileRoot { using git_iterator_type = GitTree::entries_t::const_iterator; using git_iterator = FilteredIterator<git_iterator_type>; + private: /// Iterator has two FilteredIterators, one for iterating over pairs_t /// and one for tree_t. Each FilteredIterator is constructed with a /// proper predicate, allowing for iteration on file-only or @@ -146,8 +149,6 @@ class FileRoot { }; public: - DirectoryEntries() noexcept = default; - explicit DirectoryEntries(pairs_t pairs) noexcept : data_{std::move(pairs)} {} @@ -226,7 +227,7 @@ class FileRoot { } private: - entries_t data_{}; + entries_t data_; }; FileRoot() noexcept = default; @@ -346,7 +347,7 @@ class FileRoot { dir_path.string(), ex.what()); } - return {}; + return DirectoryEntries{DirectoryEntries::pairs_t{}}; } [[nodiscard]] auto FileType(std::filesystem::path const& file_path) |