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; } |