Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[lldb] Process formatters in reverse-chronological order
If one reverts D66398 then the TestDataFormatterStdList does fail - as the C++
formatters are initialized in the opposite order. But the current state of
trunk does not mind the order for C++ formatters.

It is using now a single std::vector as suggested by Pavel Labath.

Differential Revision: https://reviews.llvm.org/D66654

llvm-svn: 372424
  • Loading branch information
jankratochvil committed Sep 20, 2019
1 parent 949a126 commit ce7cfbc
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 39 deletions.
62 changes: 27 additions & 35 deletions lldb/include/lldb/DataFormatters/FormattersContainer.h
Expand Up @@ -65,7 +65,7 @@ template <typename KeyType, typename ValueType> class FormattersContainer;
template <typename KeyType, typename ValueType> class FormatMap {
public:
typedef typename ValueType::SharedPointer ValueSP;
typedef std::map<KeyType, ValueSP> MapType;
typedef std::vector<std::pair<KeyType, ValueSP>> MapType;
typedef typename MapType::iterator MapIterator;
typedef std::function<bool(const KeyType &, const ValueSP &)> ForEachCallback;

Expand All @@ -79,20 +79,22 @@ template <typename KeyType, typename ValueType> class FormatMap {
entry->GetRevision() = 0;

std::lock_guard<std::recursive_mutex> guard(m_map_mutex);
m_map[std::move(name)] = entry;
Delete(name);
m_map.emplace_back(std::move(name), std::move(entry));
if (listener)
listener->Changed();
}

bool Delete(const KeyType &name) {
std::lock_guard<std::recursive_mutex> guard(m_map_mutex);
MapIterator iter = m_map.find(name);
if (iter == m_map.end())
return false;
m_map.erase(iter);
if (listener)
listener->Changed();
return true;
for (MapIterator iter = m_map.begin(); iter != m_map.end(); ++iter)
if (iter->first == name) {
m_map.erase(iter);
if (listener)
listener->Changed();
return true;
}
return false;
}

void Clear() {
Expand All @@ -104,11 +106,12 @@ template <typename KeyType, typename ValueType> class FormatMap {

bool Get(const KeyType &name, ValueSP &entry) {
std::lock_guard<std::recursive_mutex> guard(m_map_mutex);
MapIterator iter = m_map.find(name);
if (iter == m_map.end())
return false;
entry = iter->second;
return true;
for (const auto &pos : m_map)
if (pos.first == name) {
entry = pos.second;
return true;
}
return false;
}

void ForEach(ForEachCallback callback) {
Expand All @@ -126,29 +129,17 @@ template <typename KeyType, typename ValueType> class FormatMap {

ValueSP GetValueAtIndex(size_t index) {
std::lock_guard<std::recursive_mutex> guard(m_map_mutex);
MapIterator iter = m_map.begin();
MapIterator end = m_map.end();
while (index > 0) {
iter++;
index--;
if (end == iter)
return ValueSP();
}
return iter->second;
if (index >= m_map.size())
return ValueSP();
return m_map[index].second;
}

// If caller holds the mutex we could return a reference without copy ctor.
KeyType GetKeyAtIndex(size_t index) {
std::lock_guard<std::recursive_mutex> guard(m_map_mutex);
MapIterator iter = m_map.begin();
MapIterator end = m_map.end();
while (index > 0) {
iter++;
index--;
if (end == iter)
return KeyType();
}
return iter->first;
if (index >= m_map.size())
return {};
return m_map[index].first;
}

protected:
Expand All @@ -171,8 +162,8 @@ template <typename KeyType, typename ValueType> class FormattersContainer {
public:
typedef typename BackEndType::MapType MapType;
typedef typename MapType::iterator MapIterator;
typedef typename MapType::key_type MapKeyType;
typedef typename MapType::mapped_type MapValueType;
typedef KeyType MapKeyType;
typedef std::shared_ptr<ValueType> MapValueType;
typedef typename BackEndType::ForEachCallback ForEachCallback;
typedef typename std::shared_ptr<FormattersContainer<KeyType, ValueType>>
SharedPointer;
Expand Down Expand Up @@ -294,7 +285,8 @@ template <typename KeyType, typename ValueType> class FormattersContainer {
RegularExpression *dummy) {
llvm::StringRef key_str = key.GetStringRef();
std::lock_guard<std::recursive_mutex> guard(m_format_map.mutex());
for (const auto &pos : m_format_map.map()) {
// Patterns are matched in reverse-chronological order.
for (const auto &pos : llvm::reverse(m_format_map.map())) {
const RegularExpression &regex = pos.first;
if (regex.Execute(key_str)) {
value = pos.second;
Expand Down
4 changes: 0 additions & 4 deletions lldb/include/lldb/Utility/RegularExpression.h
Expand Up @@ -78,10 +78,6 @@ class RegularExpression {
/// otherwise.
llvm::Error GetError() const;

bool operator<(const RegularExpression &rhs) const {
return GetText() < rhs.GetText();
}

bool operator==(const RegularExpression &rhs) const {
return GetText() == rhs.GetText();
}
Expand Down
Expand Up @@ -136,6 +136,13 @@ def cleanup():
self.expect("frame variable int_array",
substrs=['1,2'])

# Test the patterns are matched in reverse-chronological order.
self.runCmd(
'type summary add --summary-string \"${var[2-3]}\" "int []"')

self.expect("frame variable int_array",
substrs=['3,4'])

self.runCmd("type summary clear")

self.runCmd("type summary add -c -x \"i_am_cool \[[0-9]\]\"")
Expand Down

0 comments on commit ce7cfbc

Please sign in to comment.