[Lldb-commits] [lldb] r262254 - Add an LLDB data formatter for single-element NSArray and NSDictionary Cocoa containers

Enrico Granata via lldb-commits lldb-commits at lists.llvm.org
Mon Feb 29 13:06:51 PST 2016


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());




More information about the lldb-commits mailing list