aboutsummaryrefslogtreecommitdiff
path: root/include/lldb/DataFormatters/FormattersContainer.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/lldb/DataFormatters/FormattersContainer.h')
-rw-r--r--include/lldb/DataFormatters/FormattersContainer.h671
1 files changed, 288 insertions, 383 deletions
diff --git a/include/lldb/DataFormatters/FormattersContainer.h b/include/lldb/DataFormatters/FormattersContainer.h
index c4694463b676..e43209969dd0 100644
--- a/include/lldb/DataFormatters/FormattersContainer.h
+++ b/include/lldb/DataFormatters/FormattersContainer.h
@@ -33,411 +33,316 @@
#include "lldb/Utility/StringLexer.h"
namespace lldb_private {
-
-class IFormatChangeListener
-{
+
+class IFormatChangeListener {
public:
- virtual
- ~IFormatChangeListener() = default;
+ virtual ~IFormatChangeListener() = default;
- virtual void
- Changed () = 0;
+ virtual void Changed() = 0;
- virtual uint32_t
- GetCurrentRevision () = 0;
+ virtual uint32_t GetCurrentRevision() = 0;
};
-
+
// if the user tries to add formatters for, say, "struct Foo"
-// those will not match any type because of the way we strip qualifiers from typenames
-// this method looks for the case where the user is adding a "class","struct","enum" or "union" Foo
+// those will not match any type because of the way we strip qualifiers from
+// typenames
+// this method looks for the case where the user is adding a
+// "class","struct","enum" or "union" Foo
// and strips the unnecessary qualifier
-static inline ConstString
-GetValidTypeName_Impl (const ConstString& type)
-{
- if (type.IsEmpty())
- return type;
-
- std::string type_cstr(type.AsCString());
- lldb_utility::StringLexer type_lexer(type_cstr);
-
- type_lexer.AdvanceIf("class ");
- type_lexer.AdvanceIf("enum ");
- type_lexer.AdvanceIf("struct ");
- type_lexer.AdvanceIf("union ");
-
- while (type_lexer.NextIf({' ','\t','\v','\f'}).first)
- ;
-
- return ConstString(type_lexer.GetUnlexed());
-}
-
-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 typename MapType::iterator MapIterator;
- typedef std::function<bool(KeyType, const ValueSP&)> ForEachCallback;
-
- FormatMap(IFormatChangeListener *lst) : m_map(), m_map_mutex(), listener(lst) {}
-
- void
- Add(KeyType name, const ValueSP &entry)
- {
- if (listener)
- entry->GetRevision() = listener->GetCurrentRevision();
- else
- entry->GetRevision() = 0;
-
- std::lock_guard<std::recursive_mutex> guard(m_map_mutex);
- m_map[name] = entry;
- if (listener)
- listener->Changed();
- }
-
- bool
- Delete(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(name);
- if (listener)
- listener->Changed();
- return true;
- }
-
- void
- Clear()
- {
- std::lock_guard<std::recursive_mutex> guard(m_map_mutex);
- m_map.clear();
- if (listener)
- listener->Changed();
- }
-
- bool
- Get(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;
- }
-
- void
- ForEach(ForEachCallback callback)
- {
- if (callback)
- {
- std::lock_guard<std::recursive_mutex> guard(m_map_mutex);
- MapIterator pos, end = m_map.end();
- for (pos = m_map.begin(); pos != end; pos++)
- {
- KeyType type = pos->first;
- if (!callback(type, pos->second))
- break;
- }
- }
- }
+static inline ConstString GetValidTypeName_Impl(const ConstString &type) {
+ if (type.IsEmpty())
+ return type;
- uint32_t
- GetCount ()
- {
- return m_map.size();
- }
+ std::string type_cstr(type.AsCString());
+ lldb_utility::StringLexer type_lexer(type_cstr);
- 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;
- }
+ type_lexer.AdvanceIf("class ");
+ type_lexer.AdvanceIf("enum ");
+ type_lexer.AdvanceIf("struct ");
+ type_lexer.AdvanceIf("union ");
- 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;
- }
+ while (type_lexer.NextIf({' ', '\t', '\v', '\f'}).first)
+ ;
-protected:
- MapType m_map;
- std::recursive_mutex m_map_mutex;
- IFormatChangeListener* listener;
-
- MapType&
- map ()
- {
- return m_map;
- }
+ return ConstString(type_lexer.GetUnlexed());
+}
- std::recursive_mutex &
- mutex()
- {
- return m_map_mutex;
- }
+template <typename KeyType, typename ValueType> class FormattersContainer;
- friend class FormattersContainer<KeyType, ValueType>;
- friend class FormatManager;
-};
-
-template<typename KeyType, typename ValueType>
-class FormattersContainer
-{
-protected:
- typedef FormatMap<KeyType,ValueType> BackEndType;
-
+template <typename KeyType, typename ValueType> class FormatMap {
public:
- typedef typename BackEndType::MapType MapType;
- typedef typename MapType::iterator MapIterator;
- typedef typename MapType::key_type MapKeyType;
- typedef typename MapType::mapped_type MapValueType;
- typedef typename BackEndType::ForEachCallback ForEachCallback;
- typedef typename std::shared_ptr<FormattersContainer<KeyType, ValueType> > SharedPointer;
-
- friend class TypeCategoryImpl;
-
- FormattersContainer(std::string name,
- IFormatChangeListener* lst) :
- m_format_map(lst),
- m_name(name)
- {
- }
-
- void
- Add (const MapKeyType &type, const MapValueType& entry)
- {
- Add_Impl(type, entry, static_cast<KeyType*>(nullptr));
- }
-
- bool
- Delete (ConstString type)
- {
- return Delete_Impl(type, static_cast<KeyType*>(nullptr));
- }
-
- bool
- Get(ValueObject& valobj,
- MapValueType& entry,
- lldb::DynamicValueType use_dynamic,
- uint32_t* why = nullptr)
- {
- uint32_t value = lldb_private::eFormatterChoiceCriterionDirectChoice;
- CompilerType ast_type(valobj.GetCompilerType());
- bool ret = Get(valobj, ast_type, entry, use_dynamic, value);
- if (ret)
- entry = MapValueType(entry);
- else
- entry = MapValueType();
- if (why)
- *why = value;
- return ret;
- }
-
- bool
- Get (ConstString type, MapValueType& entry)
- {
- return Get_Impl(type, entry, static_cast<KeyType*>(nullptr));
- }
-
- bool
- GetExact (ConstString type, MapValueType& entry)
- {
- return GetExact_Impl(type, entry, static_cast<KeyType*>(nullptr));
- }
-
- MapValueType
- GetAtIndex (size_t index)
- {
- return m_format_map.GetValueAtIndex(index);
- }
-
- lldb::TypeNameSpecifierImplSP
- GetTypeNameSpecifierAtIndex (size_t index)
- {
- return GetTypeNameSpecifierAtIndex_Impl(index, static_cast<KeyType*>(nullptr));
- }
-
- void
- Clear ()
- {
- m_format_map.Clear();
- }
-
- void
- ForEach (ForEachCallback callback)
- {
- m_format_map.ForEach(callback);
- }
-
- uint32_t
- GetCount ()
- {
- return m_format_map.GetCount();
- }
-
-protected:
- BackEndType m_format_map;
- std::string m_name;
-
- DISALLOW_COPY_AND_ASSIGN(FormattersContainer);
-
- void
- Add_Impl (const MapKeyType &type, const MapValueType& entry, lldb::RegularExpressionSP *dummy)
- {
- m_format_map.Add(type,entry);
- }
+ typedef typename ValueType::SharedPointer ValueSP;
+ typedef std::map<KeyType, ValueSP> MapType;
+ typedef typename MapType::iterator MapIterator;
+ typedef std::function<bool(KeyType, const ValueSP &)> ForEachCallback;
+
+ FormatMap(IFormatChangeListener *lst)
+ : m_map(), m_map_mutex(), listener(lst) {}
+
+ void Add(KeyType name, const ValueSP &entry) {
+ if (listener)
+ entry->GetRevision() = listener->GetCurrentRevision();
+ else
+ entry->GetRevision() = 0;
+
+ std::lock_guard<std::recursive_mutex> guard(m_map_mutex);
+ m_map[name] = entry;
+ if (listener)
+ listener->Changed();
+ }
+
+ bool Delete(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(name);
+ if (listener)
+ listener->Changed();
+ return true;
+ }
+
+ void Clear() {
+ std::lock_guard<std::recursive_mutex> guard(m_map_mutex);
+ m_map.clear();
+ if (listener)
+ listener->Changed();
+ }
+
+ bool Get(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;
+ }
+
+ void ForEach(ForEachCallback callback) {
+ if (callback) {
+ std::lock_guard<std::recursive_mutex> guard(m_map_mutex);
+ MapIterator pos, end = m_map.end();
+ for (pos = m_map.begin(); pos != end; pos++) {
+ KeyType type = pos->first;
+ if (!callback(type, pos->second))
+ break;
+ }
+ }
+ }
+
+ uint32_t GetCount() { return m_map.size(); }
+
+ 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;
+ }
+
+ 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;
+ }
- void Add_Impl (const ConstString &type, const MapValueType& entry, ConstString *dummy)
- {
- m_format_map.Add(GetValidTypeName_Impl(type), entry);
- }
+protected:
+ MapType m_map;
+ std::recursive_mutex m_map_mutex;
+ IFormatChangeListener *listener;
- bool
- Delete_Impl (ConstString type, ConstString *dummy)
- {
- return m_format_map.Delete(type);
- }
+ MapType &map() { return m_map; }
- bool
- Delete_Impl(ConstString type, lldb::RegularExpressionSP *dummy)
- {
- std::lock_guard<std::recursive_mutex> guard(m_format_map.mutex());
- MapIterator pos, end = m_format_map.map().end();
- for (pos = m_format_map.map().begin(); pos != end; pos++)
- {
- lldb::RegularExpressionSP regex = pos->first;
- if (::strcmp(type.AsCString(), regex->GetText()) == 0)
- {
- m_format_map.map().erase(pos);
- if (m_format_map.listener)
- m_format_map.listener->Changed();
- return true;
- }
- }
- return false;
- }
+ std::recursive_mutex &mutex() { return m_map_mutex; }
- bool
- Get_Impl (ConstString type, MapValueType& entry, ConstString *dummy)
- {
- return m_format_map.Get(type, entry);
- }
-
- bool
- GetExact_Impl (ConstString type, MapValueType& entry, ConstString *dummy)
- {
- return Get_Impl(type, entry, static_cast<KeyType*>(nullptr));
- }
-
- lldb::TypeNameSpecifierImplSP
- GetTypeNameSpecifierAtIndex_Impl (size_t index, ConstString *dummy)
- {
- ConstString key = m_format_map.GetKeyAtIndex(index);
- if (key)
- return lldb::TypeNameSpecifierImplSP(new TypeNameSpecifierImpl(key.AsCString(),
- false));
- else
- return lldb::TypeNameSpecifierImplSP();
- }
-
- lldb::TypeNameSpecifierImplSP
- GetTypeNameSpecifierAtIndex_Impl (size_t index, lldb::RegularExpressionSP *dummy)
- {
- lldb::RegularExpressionSP regex = m_format_map.GetKeyAtIndex(index);
- if (regex.get() == nullptr)
- return lldb::TypeNameSpecifierImplSP();
- return lldb::TypeNameSpecifierImplSP(new TypeNameSpecifierImpl(regex->GetText(),
- true));
- }
+ friend class FormattersContainer<KeyType, ValueType>;
+ friend class FormatManager;
+};
- bool
- Get_Impl(ConstString key, MapValueType &value, lldb::RegularExpressionSP *dummy)
- {
- const char *key_cstr = key.AsCString();
- if (!key_cstr)
- return false;
- std::lock_guard<std::recursive_mutex> guard(m_format_map.mutex());
- MapIterator pos, end = m_format_map.map().end();
- for (pos = m_format_map.map().begin(); pos != end; pos++)
- {
- lldb::RegularExpressionSP regex = pos->first;
- if (regex->Execute(key_cstr))
- {
- value = pos->second;
- return true;
- }
- }
- return false;
- }
+template <typename KeyType, typename ValueType> class FormattersContainer {
+protected:
+ typedef FormatMap<KeyType, ValueType> BackEndType;
- bool
- GetExact_Impl(ConstString key, MapValueType &value, lldb::RegularExpressionSP *dummy)
- {
- std::lock_guard<std::recursive_mutex> guard(m_format_map.mutex());
- MapIterator pos, end = m_format_map.map().end();
- for (pos = m_format_map.map().begin(); pos != end; pos++)
- {
- lldb::RegularExpressionSP regex = pos->first;
- if (strcmp(regex->GetText(), key.AsCString()) == 0)
- {
- value = pos->second;
- return true;
- }
- }
- return false;
- }
+public:
+ typedef typename BackEndType::MapType MapType;
+ typedef typename MapType::iterator MapIterator;
+ typedef typename MapType::key_type MapKeyType;
+ typedef typename MapType::mapped_type MapValueType;
+ typedef typename BackEndType::ForEachCallback ForEachCallback;
+ typedef typename std::shared_ptr<FormattersContainer<KeyType, ValueType>>
+ SharedPointer;
+
+ friend class TypeCategoryImpl;
+
+ FormattersContainer(std::string name, IFormatChangeListener *lst)
+ : m_format_map(lst), m_name(name) {}
+
+ void Add(const MapKeyType &type, const MapValueType &entry) {
+ Add_Impl(type, entry, static_cast<KeyType *>(nullptr));
+ }
+
+ bool Delete(ConstString type) {
+ return Delete_Impl(type, static_cast<KeyType *>(nullptr));
+ }
+
+ bool Get(ValueObject &valobj, MapValueType &entry,
+ lldb::DynamicValueType use_dynamic, uint32_t *why = nullptr) {
+ uint32_t value = lldb_private::eFormatterChoiceCriterionDirectChoice;
+ CompilerType ast_type(valobj.GetCompilerType());
+ bool ret = Get(valobj, ast_type, entry, use_dynamic, value);
+ if (ret)
+ entry = MapValueType(entry);
+ else
+ entry = MapValueType();
+ if (why)
+ *why = value;
+ return ret;
+ }
+
+ bool Get(ConstString type, MapValueType &entry) {
+ return Get_Impl(type, entry, static_cast<KeyType *>(nullptr));
+ }
+
+ bool GetExact(ConstString type, MapValueType &entry) {
+ return GetExact_Impl(type, entry, static_cast<KeyType *>(nullptr));
+ }
+
+ MapValueType GetAtIndex(size_t index) {
+ return m_format_map.GetValueAtIndex(index);
+ }
+
+ lldb::TypeNameSpecifierImplSP GetTypeNameSpecifierAtIndex(size_t index) {
+ return GetTypeNameSpecifierAtIndex_Impl(index,
+ static_cast<KeyType *>(nullptr));
+ }
+
+ void Clear() { m_format_map.Clear(); }
+
+ void ForEach(ForEachCallback callback) { m_format_map.ForEach(callback); }
+
+ uint32_t GetCount() { return m_format_map.GetCount(); }
- bool
- Get (const FormattersMatchVector& candidates,
- MapValueType& entry,
- uint32_t *reason)
- {
- for (const FormattersMatchCandidate& candidate : candidates)
- {
- if (Get(candidate.GetTypeName(),entry))
- {
- if (candidate.IsMatch(entry) == false)
- {
- entry.reset();
- continue;
- }
- else
- {
- if(reason)
- *reason = candidate.GetReason();
- return true;
- }
- }
+protected:
+ BackEndType m_format_map;
+ std::string m_name;
+
+ DISALLOW_COPY_AND_ASSIGN(FormattersContainer);
+
+ void Add_Impl(const MapKeyType &type, const MapValueType &entry,
+ lldb::RegularExpressionSP *dummy) {
+ m_format_map.Add(type, entry);
+ }
+
+ void Add_Impl(const ConstString &type, const MapValueType &entry,
+ ConstString *dummy) {
+ m_format_map.Add(GetValidTypeName_Impl(type), entry);
+ }
+
+ bool Delete_Impl(ConstString type, ConstString *dummy) {
+ return m_format_map.Delete(type);
+ }
+
+ bool Delete_Impl(ConstString type, lldb::RegularExpressionSP *dummy) {
+ std::lock_guard<std::recursive_mutex> guard(m_format_map.mutex());
+ MapIterator pos, end = m_format_map.map().end();
+ for (pos = m_format_map.map().begin(); pos != end; pos++) {
+ lldb::RegularExpressionSP regex = pos->first;
+ if (type.GetStringRef() == regex->GetText()) {
+ m_format_map.map().erase(pos);
+ if (m_format_map.listener)
+ m_format_map.listener->Changed();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool Get_Impl(ConstString type, MapValueType &entry, ConstString *dummy) {
+ return m_format_map.Get(type, entry);
+ }
+
+ bool GetExact_Impl(ConstString type, MapValueType &entry,
+ ConstString *dummy) {
+ return Get_Impl(type, entry, static_cast<KeyType *>(nullptr));
+ }
+
+ lldb::TypeNameSpecifierImplSP
+ GetTypeNameSpecifierAtIndex_Impl(size_t index, ConstString *dummy) {
+ ConstString key = m_format_map.GetKeyAtIndex(index);
+ if (key)
+ return lldb::TypeNameSpecifierImplSP(
+ new TypeNameSpecifierImpl(key.AsCString(), false));
+ else
+ return lldb::TypeNameSpecifierImplSP();
+ }
+
+ lldb::TypeNameSpecifierImplSP
+ GetTypeNameSpecifierAtIndex_Impl(size_t index,
+ lldb::RegularExpressionSP *dummy) {
+ lldb::RegularExpressionSP regex = m_format_map.GetKeyAtIndex(index);
+ if (regex.get() == nullptr)
+ return lldb::TypeNameSpecifierImplSP();
+ return lldb::TypeNameSpecifierImplSP(
+ new TypeNameSpecifierImpl(regex->GetText().str().c_str(), true));
+ }
+
+ bool Get_Impl(ConstString key, MapValueType &value,
+ lldb::RegularExpressionSP *dummy) {
+ llvm::StringRef key_str = key.GetStringRef();
+ std::lock_guard<std::recursive_mutex> guard(m_format_map.mutex());
+ MapIterator pos, end = m_format_map.map().end();
+ for (pos = m_format_map.map().begin(); pos != end; pos++) {
+ lldb::RegularExpressionSP regex = pos->first;
+ if (regex->Execute(key_str)) {
+ value = pos->second;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool GetExact_Impl(ConstString key, MapValueType &value,
+ lldb::RegularExpressionSP *dummy) {
+ std::lock_guard<std::recursive_mutex> guard(m_format_map.mutex());
+ MapIterator pos, end = m_format_map.map().end();
+ for (pos = m_format_map.map().begin(); pos != end; pos++) {
+ lldb::RegularExpressionSP regex = pos->first;
+ if (regex->GetText() == key.GetStringRef()) {
+ value = pos->second;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool Get(const FormattersMatchVector &candidates, MapValueType &entry,
+ uint32_t *reason) {
+ for (const FormattersMatchCandidate &candidate : candidates) {
+ if (Get(candidate.GetTypeName(), entry)) {
+ if (candidate.IsMatch(entry) == false) {
+ entry.reset();
+ continue;
+ } else {
+ if (reason)
+ *reason = candidate.GetReason();
+ return true;
}
- return false;
+ }
}
+ return false;
+ }
};
} // namespace lldb_private