Author: enrico Date: Mon Feb 29 15:06:50 2016 New Revision: 262254 URL: http://llvm.org/viewvc/llvm-project?rev=262254&view=rev Log: Add an LLDB data formatter for single-element NSArray and NSDictionary Cocoa containers
Fixes rdar://23715118 Modified: lldb/trunk/include/lldb/Core/ValueObject.h lldb/trunk/include/lldb/Core/ValueObjectConstResult.h lldb/trunk/include/lldb/Core/ValueObjectConstResultCast.h lldb/trunk/include/lldb/Core/ValueObjectConstResultChild.h lldb/trunk/include/lldb/Core/ValueObjectConstResultImpl.h lldb/trunk/source/Core/ValueObject.cpp lldb/trunk/source/Core/ValueObjectConstResult.cpp lldb/trunk/source/Core/ValueObjectConstResultCast.cpp lldb/trunk/source/Core/ValueObjectConstResultChild.cpp lldb/trunk/source/Core/ValueObjectConstResultImpl.cpp lldb/trunk/source/Plugins/Language/ObjC/NSArray.cpp lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.cpp lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp Modified: lldb/trunk/include/lldb/Core/ValueObject.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObject.h?rev=262254&r1=262253&r2=262254&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/ValueObject.h (original) +++ lldb/trunk/include/lldb/Core/ValueObject.h Mon Feb 29 15:06:50 2016 @@ -699,7 +699,10 @@ public: GetSyntheticExpressionPathChild(const char* expression, bool can_create); virtual lldb::ValueObjectSP - GetSyntheticChildAtOffset(uint32_t offset, const CompilerType& type, bool can_create); + GetSyntheticChildAtOffset(uint32_t offset, + const CompilerType& type, + bool can_create, + ConstString name_const_str = ConstString()); virtual lldb::ValueObjectSP GetSyntheticBase (uint32_t offset, const CompilerType& type, bool can_create); Modified: lldb/trunk/include/lldb/Core/ValueObjectConstResult.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObjectConstResult.h?rev=262254&r1=262253&r2=262254&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/ValueObjectConstResult.h (original) +++ lldb/trunk/include/lldb/Core/ValueObjectConstResult.h Mon Feb 29 15:06:50 2016 @@ -97,7 +97,10 @@ public: CreateChildAtIndex(size_t idx, bool synthetic_array_member, int32_t synthetic_index) override; lldb::ValueObjectSP - GetSyntheticChildAtOffset(uint32_t offset, const CompilerType& type, bool can_create) override; + GetSyntheticChildAtOffset(uint32_t offset, + const CompilerType& type, + bool can_create, + ConstString name_const_str = ConstString()) override; lldb::ValueObjectSP AddressOf(Error &error) override; Modified: lldb/trunk/include/lldb/Core/ValueObjectConstResultCast.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObjectConstResultCast.h?rev=262254&r1=262253&r2=262254&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/ValueObjectConstResultCast.h (original) +++ lldb/trunk/include/lldb/Core/ValueObjectConstResultCast.h Mon Feb 29 15:06:50 2016 @@ -47,7 +47,8 @@ public: lldb::ValueObjectSP GetSyntheticChildAtOffset(uint32_t offset, const CompilerType& type, - bool can_create) override; + bool can_create, + ConstString name_const_str = ConstString()) override; lldb::ValueObjectSP AddressOf (Error &error) override; Modified: lldb/trunk/include/lldb/Core/ValueObjectConstResultChild.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObjectConstResultChild.h?rev=262254&r1=262253&r2=262254&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/ValueObjectConstResultChild.h (original) +++ lldb/trunk/include/lldb/Core/ValueObjectConstResultChild.h Mon Feb 29 15:06:50 2016 @@ -53,7 +53,10 @@ public: } lldb::ValueObjectSP - GetSyntheticChildAtOffset(uint32_t offset, const CompilerType& type, bool can_create) override; + GetSyntheticChildAtOffset(uint32_t offset, + const CompilerType& type, + bool can_create, + ConstString name_const_str = ConstString()) override; lldb::ValueObjectSP AddressOf (Error &error) override; Modified: lldb/trunk/include/lldb/Core/ValueObjectConstResultImpl.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObjectConstResultImpl.h?rev=262254&r1=262253&r2=262254&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/ValueObjectConstResultImpl.h (original) +++ lldb/trunk/include/lldb/Core/ValueObjectConstResultImpl.h Mon Feb 29 15:06:50 2016 @@ -39,7 +39,10 @@ public: CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index); lldb::ValueObjectSP - GetSyntheticChildAtOffset (uint32_t offset, const CompilerType& type, bool can_create); + GetSyntheticChildAtOffset (uint32_t offset, + const CompilerType& type, + bool can_create, + ConstString name_const_str = ConstString()); lldb::ValueObjectSP AddressOf (Error &error); Modified: lldb/trunk/source/Core/ValueObject.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObject.cpp?rev=262254&r1=262253&r2=262254&view=diff ============================================================================== --- lldb/trunk/source/Core/ValueObject.cpp (original) +++ lldb/trunk/source/Core/ValueObject.cpp Mon Feb 29 15:06:50 2016 @@ -2174,14 +2174,20 @@ ValueObject::GetSyntheticBitFieldChild ( } ValueObjectSP -ValueObject::GetSyntheticChildAtOffset(uint32_t offset, const CompilerType& type, bool can_create) +ValueObject::GetSyntheticChildAtOffset(uint32_t offset, + const CompilerType& type, + bool can_create, + ConstString name_const_str) { ValueObjectSP synthetic_child_sp; - char name_str[64]; - snprintf(name_str, sizeof(name_str), "@%i", offset); - ConstString name_const_str(name_str); + if (name_const_str.IsEmpty()) + { + char name_str[64]; + snprintf(name_str, sizeof(name_str), "@%i", offset); + name_const_str.SetCString(name_str); + } // Check if we have already created a synthetic array member in this // valid object. If we have we will re-use it. Modified: lldb/trunk/source/Core/ValueObjectConstResult.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObjectConstResult.cpp?rev=262254&r1=262253&r2=262254&view=diff ============================================================================== --- lldb/trunk/source/Core/ValueObjectConstResult.cpp (original) +++ lldb/trunk/source/Core/ValueObjectConstResult.cpp Mon Feb 29 15:06:50 2016 @@ -314,9 +314,12 @@ ValueObjectConstResult::Dereference (Err } lldb::ValueObjectSP -ValueObjectConstResult::GetSyntheticChildAtOffset(uint32_t offset, const CompilerType& type, bool can_create) +ValueObjectConstResult::GetSyntheticChildAtOffset(uint32_t offset, + const CompilerType& type, + bool can_create, + ConstString name_const_str) { - return m_impl.GetSyntheticChildAtOffset(offset, type, can_create); + return m_impl.GetSyntheticChildAtOffset(offset, type, can_create, name_const_str); } lldb::ValueObjectSP Modified: lldb/trunk/source/Core/ValueObjectConstResultCast.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObjectConstResultCast.cpp?rev=262254&r1=262253&r2=262254&view=diff ============================================================================== --- lldb/trunk/source/Core/ValueObjectConstResultCast.cpp (original) +++ lldb/trunk/source/Core/ValueObjectConstResultCast.cpp Mon Feb 29 15:06:50 2016 @@ -40,9 +40,10 @@ ValueObjectConstResultCast::Dereference lldb::ValueObjectSP ValueObjectConstResultCast::GetSyntheticChildAtOffset(uint32_t offset, const CompilerType& type, - bool can_create) + bool can_create, + ConstString name_const_str) { - return m_impl.GetSyntheticChildAtOffset(offset, type, can_create); + return m_impl.GetSyntheticChildAtOffset(offset, type, can_create, name_const_str); } lldb::ValueObjectSP Modified: lldb/trunk/source/Core/ValueObjectConstResultChild.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObjectConstResultChild.cpp?rev=262254&r1=262253&r2=262254&view=diff ============================================================================== --- lldb/trunk/source/Core/ValueObjectConstResultChild.cpp (original) +++ lldb/trunk/source/Core/ValueObjectConstResultChild.cpp Mon Feb 29 15:06:50 2016 @@ -57,9 +57,15 @@ ValueObjectConstResultChild::Dereference } lldb::ValueObjectSP -ValueObjectConstResultChild::GetSyntheticChildAtOffset(uint32_t offset, const CompilerType& type, bool can_create) +ValueObjectConstResultChild::GetSyntheticChildAtOffset(uint32_t offset, + const CompilerType& type, + bool can_create, + ConstString name_const_str) { - return m_impl.GetSyntheticChildAtOffset(offset, type, can_create); + return m_impl.GetSyntheticChildAtOffset(offset, + type, + can_create, + name_const_str); } lldb::ValueObjectSP Modified: lldb/trunk/source/Core/ValueObjectConstResultImpl.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObjectConstResultImpl.cpp?rev=262254&r1=262253&r2=262254&view=diff ============================================================================== --- lldb/trunk/source/Core/ValueObjectConstResultImpl.cpp (original) +++ lldb/trunk/source/Core/ValueObjectConstResultImpl.cpp Mon Feb 29 15:06:50 2016 @@ -117,12 +117,18 @@ ValueObjectConstResultImpl::CreateChildA } lldb::ValueObjectSP -ValueObjectConstResultImpl::GetSyntheticChildAtOffset (uint32_t offset, const CompilerType& type, bool can_create) +ValueObjectConstResultImpl::GetSyntheticChildAtOffset (uint32_t offset, + const CompilerType& type, + bool can_create, + ConstString name_const_str) { if (m_impl_backend == NULL) return lldb::ValueObjectSP(); - return m_impl_backend->ValueObject::GetSyntheticChildAtOffset(offset, type, can_create); + return m_impl_backend->ValueObject::GetSyntheticChildAtOffset(offset, + type, + can_create, + name_const_str); } lldb::ValueObjectSP Modified: lldb/trunk/source/Plugins/Language/ObjC/NSArray.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/NSArray.cpp?rev=262254&r1=262253&r2=262254&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Language/ObjC/NSArray.cpp (original) +++ lldb/trunk/source/Plugins/Language/ObjC/NSArray.cpp Mon Feb 29 15:06:50 2016 @@ -227,6 +227,29 @@ namespace lldb_private { size_t GetIndexOfChildWithName(const ConstString &name) override; }; + + class NSArray1SyntheticFrontEnd : public SyntheticChildrenFrontEnd + { + public: + NSArray1SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); + + ~NSArray1SyntheticFrontEnd() override = default; + + size_t + CalculateNumChildren() override; + + lldb::ValueObjectSP + GetChildAtIndex(size_t idx) override; + + bool + Update() override; + + bool + MightHaveChildren() override; + + size_t + GetIndexOfChildWithName(const ConstString &name) override; + }; } // namespace formatters } // namespace lldb_private @@ -258,30 +281,40 @@ lldb_private::formatters::NSArraySummary uint64_t value = 0; - const char* class_name = descriptor->GetClassName().GetCString(); + ConstString class_name(descriptor->GetClassName()); - if (!class_name || !*class_name) + static const ConstString g_NSArrayI("__NSArrayI"); + static const ConstString g_NSArrayM("__NSArrayM"); + static const ConstString g_NSArray0("__NSArray0"); + static const ConstString g_NSArray1("__NSSingleObjectArrayI"); + static const ConstString g_NSArrayCF("__NSCFArray"); + + if (class_name.IsEmpty()) return false; - if (!strcmp(class_name,"__NSArrayI")) + if (class_name == g_NSArrayI) { Error error; value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); if (error.Fail()) return false; } - else if (!strcmp(class_name,"__NSArrayM")) + else if (class_name == g_NSArrayM) { Error error; value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); if (error.Fail()) return false; } - else if (!strcmp(class_name,"__NSArray0")) + else if (class_name == g_NSArray0) { value = 0; } - else if (!strcmp(class_name,"__NSCFArray")) + else if (class_name == g_NSArray1) + { + value = 1; + } + else if (class_name == g_NSArrayCF) { Error error; value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + 2 * ptr_size, ptr_size, 0, error); @@ -666,6 +699,53 @@ lldb_private::formatters::NSArray0Synthe return lldb::ValueObjectSP(); } +lldb_private::formatters::NSArray1SyntheticFrontEnd::NSArray1SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : +SyntheticChildrenFrontEnd (*valobj_sp.get()) +{ +} + +size_t +lldb_private::formatters::NSArray1SyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) +{ + static const ConstString g_zero("[0]"); + + if (name == g_zero) + return 0; + + return UINT32_MAX; +} + +size_t +lldb_private::formatters::NSArray1SyntheticFrontEnd::CalculateNumChildren () +{ + return 1; +} + +bool +lldb_private::formatters::NSArray1SyntheticFrontEnd::Update() +{ + return false; +} + +bool +lldb_private::formatters::NSArray1SyntheticFrontEnd::MightHaveChildren () +{ + return true; +} + +lldb::ValueObjectSP +lldb_private::formatters::NSArray1SyntheticFrontEnd::GetChildAtIndex (size_t idx) +{ + static const ConstString g_zero("[0]"); + + if (idx == 0) + { + CompilerType id_type(m_backend.GetTargetSP()->GetScratchClangASTContext()->GetBasicType(lldb::eBasicTypeObjCID)); + return m_backend.GetSyntheticChildAtOffset(m_backend.GetProcessSP()->GetAddressByteSize(), id_type, true, g_zero); + } + return lldb::ValueObjectSP(); +} + SyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) { if (!valobj_sp) @@ -694,20 +774,29 @@ SyntheticChildrenFrontEnd* lldb_private: if (!descriptor || !descriptor->IsValid()) return nullptr; - const char* class_name = descriptor->GetClassName().GetCString(); + ConstString class_name(descriptor->GetClassName()); + + static const ConstString g_NSArrayI("__NSArrayI"); + static const ConstString g_NSArrayM("__NSArrayM"); + static const ConstString g_NSArray0("__NSArray0"); + static const ConstString g_NSArray1("__NSSingleObjectArrayI"); - if (!class_name || !*class_name) + if (class_name.IsEmpty()) return nullptr; - if (!strcmp(class_name,"__NSArrayI")) + if (class_name == g_NSArrayI) { return (new NSArrayISyntheticFrontEnd(valobj_sp)); } - else if (!strcmp(class_name,"__NSArray0")) + else if (class_name == g_NSArrayM) { return (new NSArray0SyntheticFrontEnd(valobj_sp)); } - else if (!strcmp(class_name,"__NSArrayM")) + else if (class_name == g_NSArray1) + { + return (new NSArray1SyntheticFrontEnd(valobj_sp)); + } + else if (class_name == g_NSArrayM) { if (runtime->GetFoundationVersion() >= 1100) return (new NSArrayMSyntheticFrontEnd_1010(valobj_sp)); Modified: lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.cpp?rev=262254&r1=262253&r2=262254&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.cpp (original) +++ lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.cpp Mon Feb 29 15:06:50 2016 @@ -131,6 +131,32 @@ namespace lldb_private { CompilerType m_pair_type; std::vector<DictionaryItemDescriptor> m_children; }; + + class NSDictionary1SyntheticFrontEnd : public SyntheticChildrenFrontEnd + { + public: + NSDictionary1SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); + + ~NSDictionary1SyntheticFrontEnd() override = default; + + size_t + CalculateNumChildren() override; + + lldb::ValueObjectSP + GetChildAtIndex(size_t idx) override; + + bool + Update() override; + + bool + MightHaveChildren() override; + + size_t + GetIndexOfChildWithName(const ConstString &name) override; + + private: + ValueObjectSP m_pair; + }; class NSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd { @@ -222,13 +248,16 @@ lldb_private::formatters::NSDictionarySu uint64_t value = 0; - ConstString class_name_cs = descriptor->GetClassName(); - const char* class_name = class_name_cs.GetCString(); - - if (!class_name || !*class_name) - return false; + ConstString class_name(descriptor->GetClassName()); + + static const ConstString g_DictionaryI("__NSDictionaryI"); + static const ConstString g_DictionaryM("__NSDictionaryM"); + static const ConstString g_Dictionary1("__NSSingleEntryDictionaryI"); - if (!strcmp(class_name,"__NSDictionaryI")) + if (class_name.IsEmpty()) + return nullptr; + + if (class_name == g_DictionaryI) { Error error; value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); @@ -236,7 +265,7 @@ lldb_private::formatters::NSDictionarySu return false; value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); } - else if (!strcmp(class_name,"__NSDictionaryM")) + else if (class_name == g_DictionaryM) { Error error; value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); @@ -244,6 +273,10 @@ lldb_private::formatters::NSDictionarySu return false; value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); } + else if (class_name == g_Dictionary1) + { + value = 1; + } /*else if (!strcmp(class_name,"__NSCFDictionary")) { Error error; @@ -256,7 +289,7 @@ lldb_private::formatters::NSDictionarySu else { auto& map(NSDictionary_Additionals::GetAdditionalSummaries()); - auto iter = map.find(class_name_cs), end = map.end(); + auto iter = map.find(class_name), end = map.end(); if (iter != end) return iter->second(valobj, stream, options); else @@ -307,24 +340,31 @@ SyntheticChildrenFrontEnd* lldb_private: if (!descriptor || !descriptor->IsValid()) return nullptr; - ConstString class_name_cs = descriptor->GetClassName(); - const char* class_name = class_name_cs.GetCString(); + ConstString class_name(descriptor->GetClassName()); + + static const ConstString g_DictionaryI("__NSDictionaryI"); + static const ConstString g_DictionaryM("__NSDictionaryM"); + static const ConstString g_Dictionary1("__NSSingleEntryDictionaryI"); - if (!class_name || !*class_name) + if (class_name.IsEmpty()) return nullptr; - if (!strcmp(class_name,"__NSDictionaryI")) + if (class_name == g_DictionaryI) { return (new NSDictionaryISyntheticFrontEnd(valobj_sp)); } - else if (!strcmp(class_name,"__NSDictionaryM")) + else if (class_name == g_DictionaryM) { return (new NSDictionaryMSyntheticFrontEnd(valobj_sp)); } + else if (class_name == g_Dictionary1) + { + return (new NSDictionary1SyntheticFrontEnd(valobj_sp)); + } else { auto& map(NSDictionary_Additionals::GetAdditionalSynthetics()); - auto iter = map.find(class_name_cs), end = map.end(); + auto iter = map.find(class_name), end = map.end(); if (iter != end) return iter->second(synth, valobj_sp); } @@ -497,6 +537,96 @@ lldb_private::formatters::NSDictionaryIS return dict_item.valobj_sp; } +lldb_private::formatters::NSDictionary1SyntheticFrontEnd::NSDictionary1SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : +SyntheticChildrenFrontEnd(*valobj_sp.get()), +m_pair(nullptr) +{ +} + +size_t +lldb_private::formatters::NSDictionary1SyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) +{ + static const ConstString g_zero("[0]"); + + if (name == g_zero) + return 0; + + return UINT32_MAX; +} + +size_t +lldb_private::formatters::NSDictionary1SyntheticFrontEnd::CalculateNumChildren () +{ + return 1; +} + +bool +lldb_private::formatters::NSDictionary1SyntheticFrontEnd::Update() +{ + m_pair.reset(); + return false; +} + +bool +lldb_private::formatters::NSDictionary1SyntheticFrontEnd::MightHaveChildren () +{ + return true; +} + +lldb::ValueObjectSP +lldb_private::formatters::NSDictionary1SyntheticFrontEnd::GetChildAtIndex (size_t idx) +{ + if (idx != 0) + return lldb::ValueObjectSP(); + + if (m_pair.get()) + return m_pair; + + auto process_sp(m_backend.GetProcessSP()); + if (!process_sp) + return nullptr; + + auto ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t key_ptr = m_backend.GetValueAsUnsigned(LLDB_INVALID_ADDRESS) + ptr_size; + lldb::addr_t value_ptr = key_ptr + ptr_size; + + Error error; + + lldb::addr_t key_at_idx = process_sp->ReadPointerFromMemory(key_ptr, error); + if (error.Fail()) + return nullptr; + lldb::addr_t value_at_idx = process_sp->ReadPointerFromMemory(value_ptr, error); + if (error.Fail()) + return nullptr; + + auto pair_type = GetLLDBNSPairType(process_sp->GetTarget().shared_from_this()); + + DataBufferSP buffer_sp(new DataBufferHeap(2*ptr_size,0)); + + if (ptr_size == 8) + { + uint64_t *data_ptr = (uint64_t *)buffer_sp->GetBytes(); + *data_ptr = key_at_idx; + *(data_ptr+1) = value_at_idx; + } + else + { + uint32_t *data_ptr = (uint32_t *)buffer_sp->GetBytes(); + *data_ptr = key_ptr; + *(data_ptr+1) = value_ptr; + } + + DataExtractor data(buffer_sp, process_sp->GetByteOrder(), ptr_size); + m_pair = CreateValueObjectFromData("[0]", + data, + m_backend.GetExecutionContextRef(), + pair_type); + + + return m_pair; +} + lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), Modified: lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp?rev=262254&r1=262253&r2=262254&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp (original) +++ lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp Mon Feb 29 15:06:50 2016 @@ -453,6 +453,7 @@ LoadObjCFormatters(TypeCategoryImplSP ob AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags); AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayI"), appkit_flags); AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArray0"), appkit_flags); + AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSSingleObjectArrayI"), appkit_flags); AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayM"), appkit_flags); AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSCFArray"), appkit_flags); AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFArrayRef"), appkit_flags); @@ -462,6 +463,7 @@ LoadObjCFormatters(TypeCategoryImplSP ob AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSMutableDictionary"), appkit_flags); AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSCFDictionary"), appkit_flags); AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryI"), appkit_flags); + AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSSingleEntryDictionaryI"), appkit_flags); AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryM"), appkit_flags); AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFDictionaryRef"), appkit_flags); AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFMutableDictionaryRef"), appkit_flags); @@ -489,6 +491,7 @@ LoadObjCFormatters(TypeCategoryImplSP ob AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayM"), ScriptedSyntheticChildren::Flags()); AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayI"), ScriptedSyntheticChildren::Flags()); AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArray0"), ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSSingleObjectArrayI"), ScriptedSyntheticChildren::Flags()); AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSArray"), ScriptedSyntheticChildren::Flags()); AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSMutableArray"), ScriptedSyntheticChildren::Flags()); AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSCFArray"), ScriptedSyntheticChildren::Flags()); @@ -497,6 +500,7 @@ LoadObjCFormatters(TypeCategoryImplSP ob AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryM"), ScriptedSyntheticChildren::Flags()); AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryI"), ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSSingleEntryDictionaryI"), ScriptedSyntheticChildren::Flags()); AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSCFDictionary"), ScriptedSyntheticChildren::Flags()); AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSDictionary"), ScriptedSyntheticChildren::Flags()); AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSMutableDictionary"), ScriptedSyntheticChildren::Flags()); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits