diff options
-rw-r--r-- | lldb/source/Plugins/Language/ObjC/Cocoa.h | 11 | ||||
-rw-r--r-- | lldb/source/Plugins/Language/ObjC/NSArray.cpp | 32 |
2 files changed, 41 insertions, 2 deletions
diff --git a/lldb/source/Plugins/Language/ObjC/Cocoa.h b/lldb/source/Plugins/Language/ObjC/Cocoa.h index be3f3599133..f43b1639cb3 100644 --- a/lldb/source/Plugins/Language/ObjC/Cocoa.h +++ b/lldb/source/Plugins/Language/ObjC/Cocoa.h @@ -13,6 +13,7 @@ #include "lldb/Core/Stream.h" #include "lldb/Core/ValueObject.h" #include "lldb/DataFormatters/TypeSummary.h" +#include "lldb/DataFormatters/TypeSynthetic.h" #include "lldb/Target/ObjCLanguageRuntime.h" namespace lldb_private { @@ -88,6 +89,16 @@ namespace lldb_private { SyntheticChildrenFrontEnd* NSExceptionSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp); + + class NSArray_Additionals + { + public: + static std::map<ConstString, CXXFunctionSummaryFormat::Callback>& + GetAdditionalSummaries (); + + static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>& + GetAdditionalSynthetics (); + }; } // namespace formatters } // namespace lldb_private diff --git a/lldb/source/Plugins/Language/ObjC/NSArray.cpp b/lldb/source/Plugins/Language/ObjC/NSArray.cpp index b9b4b9a20e9..7f29c190e27 100644 --- a/lldb/source/Plugins/Language/ObjC/NSArray.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSArray.cpp @@ -35,6 +35,20 @@ using namespace lldb_private::formatters; namespace lldb_private { namespace formatters { + std::map<ConstString, CXXFunctionSummaryFormat::Callback>& + NSArray_Additionals::GetAdditionalSummaries () + { + static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map; + return g_map; + } + + std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>& + NSArray_Additionals::GetAdditionalSynthetics () + { + static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> g_map; + return g_map; + } + class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd { public: @@ -322,7 +336,14 @@ lldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& s return false; } else - return false; + { + auto& map(NSArray_Additionals::GetAdditionalSummaries()); + auto iter = map.find(class_name), end = map.end(); + if (iter != end) + return iter->second(valobj, stream, options); + else + return false; + } std::string prefix,suffix; if (Language* language = Language::FindPlugin(options.GetLanguage())) @@ -746,7 +767,7 @@ lldb_private::formatters::NSArray1SyntheticFrontEnd::GetChildAtIndex (size_t idx return lldb::ValueObjectSP(); } -SyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) +SyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCreator (CXXSyntheticChildren* synth, lldb::ValueObjectSP valobj_sp) { if (!valobj_sp) return nullptr; @@ -803,6 +824,13 @@ SyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCre else return (new NSArrayMSyntheticFrontEnd_109(valobj_sp)); } + else + { + auto& map(NSArray_Additionals::GetAdditionalSynthetics()); + auto iter = map.find(class_name), end = map.end(); + if (iter != end) + return iter->second(synth, valobj_sp); + } return nullptr; } |