diff --git a/src/symbols/symbols.hpp b/src/symbols/symbols.hpp index 8264c47..657e112 100644 --- a/src/symbols/symbols.hpp +++ b/src/symbols/symbols.hpp @@ -22,6 +22,7 @@ namespace detail { std::pair, std::reference_wrapper> >; + // These two helpers create a map from a target object to a vector of frames to resolve std::unordered_map collate_frames( const std::vector& frames, std::vector& trace diff --git a/src/symbols/symbols_core.cpp b/src/symbols/symbols_core.cpp index 909028f..9275c2d 100644 --- a/src/symbols/symbols_core.cpp +++ b/src/symbols/symbols_core.cpp @@ -8,11 +8,12 @@ namespace cpptrace { namespace detail { - std::unordered_map collate_frames( + template + std::unordered_map collate_frames( const std::vector& frames, - std::vector& trace + std::vector& trace ) { - std::unordered_map entries; + std::unordered_map entries; for(std::size_t i = 0; i < frames.size(); i++) { const auto& entry = frames[i]; // If libdl fails to find the shared object for a frame, the path will be empty. I've observed this @@ -26,24 +27,18 @@ namespace detail { } return entries; } - // TODO: Refactor to eliminate the code duplication + + std::unordered_map collate_frames( + const std::vector& frames, + std::vector& trace + ) { + return collate_frames(frames, trace); + } std::unordered_map collate_frames( const std::vector& frames, std::vector& trace ) { - std::unordered_map entries; - for(std::size_t i = 0; i < frames.size(); i++) { - const auto& entry = frames[i]; - // If libdl fails to find the shared object for a frame, the path will be empty. I've observed this - // on macos when looking up the shared object containing `start`. - if(!entry.object_path.empty()) { - entries[entry.object_path].emplace_back( - entry, - trace[i] - ); - } - } - return entries; + return collate_frames(frames, trace); } /*