diff options
Diffstat (limited to 'source/Plugins/Language/ObjC/NSArray.cpp')
| -rw-r--r-- | source/Plugins/Language/ObjC/NSArray.cpp | 262 | 
1 files changed, 148 insertions, 114 deletions
diff --git a/source/Plugins/Language/ObjC/NSArray.cpp b/source/Plugins/Language/ObjC/NSArray.cpp index ccc82ab95ecc..5de97b6f0257 100644 --- a/source/Plugins/Language/ObjC/NSArray.cpp +++ b/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: @@ -73,7 +87,6 @@ namespace  lldb_private {              ExecutionContextRef m_exe_ctx_ref;              uint8_t m_ptr_size;              CompilerType m_id_type; -            std::vector<lldb::ValueObjectSP> m_children;          };          class NSArrayMSyntheticFrontEnd_109 : public NSArrayMSyntheticFrontEnd @@ -103,7 +116,7 @@ namespace  lldb_private {              struct DataDescriptor_32              {                  uint32_t _used; -                uint32_t _priv1 : 2 ; +                uint32_t _priv1 : 2;                  uint32_t _size : 30;                  uint32_t _priv2 : 2;                  uint32_t _offset : 30; @@ -114,7 +127,7 @@ namespace  lldb_private {              struct DataDescriptor_64              {                  uint64_t _used; -                uint64_t _priv1 : 2 ; +                uint64_t _priv1 : 2;                  uint64_t _size : 62;                  uint64_t _priv2 : 2;                  uint64_t _offset : 62; @@ -202,7 +215,6 @@ namespace  lldb_private {              uint64_t m_items;              lldb::addr_t m_data_ptr;              CompilerType m_id_type; -            std::vector<lldb::ValueObjectSP> m_children;          };          class NSArray0SyntheticFrontEnd : public SyntheticChildrenFrontEnd @@ -227,14 +239,14 @@ namespace  lldb_private {              size_t              GetIndexOfChildWithName(const ConstString &name) override;          }; -         -        class NSArrayCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd + +        class NSArray1SyntheticFrontEnd : public SyntheticChildrenFrontEnd          {          public: -            NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - -            ~NSArrayCodeRunningSyntheticFrontEnd() override = default; - +            NSArray1SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); +             +            ~NSArray1SyntheticFrontEnd() override = default; +                          size_t              CalculateNumChildren() override; @@ -269,7 +281,7 @@ lldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& s      ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); -    if (!descriptor.get() || !descriptor->IsValid()) +    if (!descriptor || !descriptor->IsValid())          return false;      uint32_t ptr_size = process_sp->GetAddressByteSize(); @@ -281,30 +293,40 @@ lldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& s      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); @@ -313,7 +335,11 @@ lldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& s      }      else      { -        if (!ExtractValueFromObjCExpression(valobj, "int", "count", value)) +        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;      } @@ -340,8 +366,7 @@ lldb_private::formatters::NSArrayMSyntheticFrontEnd::NSArrayMSyntheticFrontEnd (  SyntheticChildrenFrontEnd(*valobj_sp),  m_exe_ctx_ref(),  m_ptr_size(8), -m_id_type(), -m_children() +m_id_type()  {      if (valobj_sp)      { @@ -354,16 +379,16 @@ m_children()  }  lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::NSArrayMSyntheticFrontEnd_109 (lldb::ValueObjectSP valobj_sp) : -NSArrayMSyntheticFrontEnd(valobj_sp), -m_data_32(NULL), -m_data_64(NULL) +    NSArrayMSyntheticFrontEnd(valobj_sp), +    m_data_32(nullptr), +    m_data_64(nullptr)  {  }  lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::NSArrayMSyntheticFrontEnd_1010 (lldb::ValueObjectSP valobj_sp) : -NSArrayMSyntheticFrontEnd(valobj_sp), -m_data_32(NULL), -m_data_64(NULL) +    NSArrayMSyntheticFrontEnd(valobj_sp), +    m_data_32(nullptr), +    m_data_64(nullptr)  {  } @@ -386,24 +411,21 @@ lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex (size_t idx      object_at_idx += (pyhs_idx * m_ptr_size);      StreamString idx_name;      idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); -    lldb::ValueObjectSP retval_sp = CreateValueObjectFromAddress(idx_name.GetData(), -                                                                 object_at_idx, -                                                                 m_exe_ctx_ref, -                                                                 m_id_type); -    m_children.push_back(retval_sp); -    return retval_sp; +    return CreateValueObjectFromAddress(idx_name.GetData(), +                                        object_at_idx, +                                        m_exe_ctx_ref, +                                        m_id_type);  }  bool  lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::Update()  { -    m_children.clear();      ValueObjectSP valobj_sp = m_backend.GetSP();      m_ptr_size = 0;      delete m_data_32; -    m_data_32 = NULL; +    m_data_32 = nullptr;      delete m_data_64; -    m_data_64 = NULL; +    m_data_64 = nullptr;      if (!valobj_sp)          return false;      m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); @@ -432,13 +454,12 @@ lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::Update()  bool  lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::Update()  { -    m_children.clear();      ValueObjectSP valobj_sp = m_backend.GetSP();      m_ptr_size = 0;      delete m_data_32; -    m_data_32 = NULL; +    m_data_32 = nullptr;      delete m_data_64; -    m_data_64 = NULL; +    m_data_64 = nullptr;      if (!valobj_sp)          return false;      m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); @@ -483,9 +504,9 @@ lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetIndexOfChildWithName (co  lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::~NSArrayMSyntheticFrontEnd_109()  {      delete m_data_32; -    m_data_32 = NULL; +    m_data_32 = nullptr;      delete m_data_64; -    m_data_64 = NULL; +    m_data_64 = nullptr;  }  lldb::addr_t @@ -527,9 +548,9 @@ lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetSize ()  lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::~NSArrayMSyntheticFrontEnd_1010()  {      delete m_data_32; -    m_data_32 = NULL; +    m_data_32 = nullptr;      delete m_data_64; -    m_data_64 = NULL; +    m_data_64 = nullptr;  }  lldb::addr_t @@ -569,11 +590,11 @@ lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetSize ()  }  lldb_private::formatters::NSArrayISyntheticFrontEnd::NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd (*valobj_sp.get()), -m_exe_ctx_ref (), -m_ptr_size (8), -m_items (0), -m_data_ptr (0) +    SyntheticChildrenFrontEnd(*valobj_sp), +    m_exe_ctx_ref(), +    m_ptr_size(8), +    m_items(0), +    m_data_ptr(0)  {      if (valobj_sp)      { @@ -609,7 +630,6 @@ lldb_private::formatters::NSArrayISyntheticFrontEnd::Update()      m_ptr_size = 0;      m_items = 0;      m_data_ptr = 0; -    m_children.clear();      ValueObjectSP valobj_sp = m_backend.GetSP();      if (!valobj_sp)          return false; @@ -649,16 +669,14 @@ lldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex (size_t idx          return lldb::ValueObjectSP();      StreamString idx_name;      idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); -    lldb::ValueObjectSP retval_sp = CreateValueObjectFromAddress(idx_name.GetData(), -                                                                 object_at_idx, -                                                                 m_exe_ctx_ref, -                                                                 m_id_type); -    m_children.push_back(retval_sp); -    return retval_sp; +    return CreateValueObjectFromAddress(idx_name.GetData(), +                                        object_at_idx, +                                        m_exe_ctx_ref, +                                        m_id_type);  }  lldb_private::formatters::NSArray0SyntheticFrontEnd::NSArray0SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd (*valobj_sp.get()) +    SyntheticChildrenFrontEnd(*valobj_sp)  {  } @@ -692,17 +710,64 @@ lldb_private::formatters::NSArray0SyntheticFrontEnd::GetChildAtIndex (size_t idx      return lldb::ValueObjectSP();  } -SyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) +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* synth, lldb::ValueObjectSP valobj_sp)  {      if (!valobj_sp)          return nullptr;      lldb::ProcessSP process_sp (valobj_sp->GetProcessSP());      if (!process_sp) -        return NULL; +        return nullptr;      AppleObjCRuntime *runtime = llvm::dyn_cast_or_null<AppleObjCRuntime>(process_sp->GetObjCLanguageRuntime());      if (!runtime) -        return NULL; +        return nullptr;      CompilerType valobj_type(valobj_sp->GetCompilerType());      Flags flags(valobj_type.GetTypeInfo()); @@ -712,28 +777,37 @@ SyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCre          Error error;          valobj_sp = valobj_sp->AddressOf(error);          if (error.Fail() || !valobj_sp) -            return NULL; +            return nullptr;      } -    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get())); +    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp)); -    if (!descriptor.get() || !descriptor->IsValid()) -        return NULL; +    if (!descriptor || !descriptor->IsValid()) +        return nullptr; -    const char* class_name = descriptor->GetClassName().GetCString(); +    ConstString class_name(descriptor->GetClassName()); -    if (!class_name || !*class_name) -        return NULL; +    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.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_NSArray0)      {          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)); @@ -742,51 +816,11 @@ SyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCre      }      else      { -        return (new NSArrayCodeRunningSyntheticFrontEnd(valobj_sp)); -    } -} - -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()) -{} - -size_t -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::CalculateNumChildren () -{ -    uint64_t count = 0; -    if (ExtractValueFromObjCExpression(m_backend, "int", "count", count)) -        return count; -    return 0; -} - -lldb::ValueObjectSP -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ -    StreamString idx_name; -    idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); -    lldb::ValueObjectSP valobj_sp = CallSelectorOnObject(m_backend,"id","objectAtIndex:",idx); -    if (valobj_sp) -    { -        valobj_sp->SetPreferredDisplayLanguage(m_backend.GetPreferredDisplayLanguage()); -        valobj_sp->SetName(ConstString(idx_name.GetData())); +        auto& map(NSArray_Additionals::GetAdditionalSynthetics()); +        auto iter = map.find(class_name), end = map.end(); +        if (iter != end) +            return iter->second(synth, valobj_sp);      } -    return valobj_sp; -} - -bool -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::Update() -{ -    return false; -} - -bool -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::MightHaveChildren () -{ -    return true; -} - -size_t -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ -    return 0; +     +    return nullptr;  }  | 
