diff options
| author | Enrico Granata <egranata@apple.com> | 2014-10-07 22:15:27 +0000 |
|---|---|---|
| committer | Enrico Granata <egranata@apple.com> | 2014-10-07 22:15:27 +0000 |
| commit | 29551955a9227812848656b95451ec6dd824690b (patch) | |
| tree | 7443597fc5c94ce7e89cb61c1968a8f956deb6db /lldb/source/DataFormatters | |
| parent | 2959356958c7f265c55d98e962e61af623773d44 (diff) | |
| download | bcm5719-llvm-29551955a9227812848656b95451ec6dd824690b.tar.gz bcm5719-llvm-29551955a9227812848656b95451ec6dd824690b.zip | |
The type category enable * was implemented assuming a previous disable * had happened. While that will most likely be true in practice, the consequences of this not being the case will be a crash. I fix the crash by doing two things: 1) don't let already-enabled categories be enabled anyway; 2) if a category were disabled but with a bogus last-enabled position - highly highly unlikely - just put it in the first empty slot. I am not so sure 2) is bulletproof perfect, but I also don't think 2) will practically ever happen
llvm-svn: 219245
Diffstat (limited to 'lldb/source/DataFormatters')
| -rw-r--r-- | lldb/source/DataFormatters/TypeCategoryMap.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/lldb/source/DataFormatters/TypeCategoryMap.cpp b/lldb/source/DataFormatters/TypeCategoryMap.cpp index c5f22b06628..ae34d033901 100644 --- a/lldb/source/DataFormatters/TypeCategoryMap.cpp +++ b/lldb/source/DataFormatters/TypeCategoryMap.cpp @@ -126,10 +126,25 @@ TypeCategoryMap::EnableAllCategories () std::vector<ValueSP> sorted_categories(m_map.size(), ValueSP()); MapType::iterator iter = m_map.begin(), end = m_map.end(); for (; iter != end; ++iter) - sorted_categories.at(iter->second->GetLastEnabledPosition()) = iter->second; + { + if (iter->second->IsEnabled()) + continue; + auto pos = iter->second->GetLastEnabledPosition(); + if (pos >= sorted_categories.size()) + { + auto iter = std::find_if(sorted_categories.begin(), + sorted_categories.end(), + [] (const ValueSP& sp) -> bool { + return sp.get() == nullptr; + }); + pos = std::distance(sorted_categories.begin(), iter); + } + sorted_categories.at(pos) = iter->second; + } decltype(sorted_categories)::iterator viter = sorted_categories.begin(), vend = sorted_categories.end(); for (; viter != vend; viter++) - Enable(*viter, Last); + if (viter->get()) + Enable(*viter, Last); } void |

