diff options
Diffstat (limited to 'source/Plugins/Language/ObjC/NSError.cpp')
-rw-r--r-- | source/Plugins/Language/ObjC/NSError.cpp | 63 |
1 files changed, 37 insertions, 26 deletions
diff --git a/source/Plugins/Language/ObjC/NSError.cpp b/source/Plugins/Language/ObjC/NSError.cpp index c627cd031926..4bfb024206d3 100644 --- a/source/Plugins/Language/ObjC/NSError.cpp +++ b/source/Plugins/Language/ObjC/NSError.cpp @@ -34,27 +34,49 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -bool -lldb_private::formatters::NSError_SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) +static lldb::addr_t +DerefToNSErrorPointer (ValueObject& valobj) { - ProcessSP process_sp(valobj.GetProcessSP()); - if (!process_sp) - return false; - - lldb::addr_t ptr_value = LLDB_INVALID_ADDRESS; - CompilerType valobj_type(valobj.GetCompilerType()); Flags type_flags(valobj_type.GetTypeInfo()); if (type_flags.AllClear(eTypeHasValue)) { if (valobj.IsBaseClass() && valobj.GetParent()) - ptr_value = valobj.GetParent()->GetValueAsUnsigned(LLDB_INVALID_ADDRESS); + return valobj.GetParent()->GetValueAsUnsigned(LLDB_INVALID_ADDRESS); } else - ptr_value = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); + { + lldb::addr_t ptr_value = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); + if (type_flags.AllSet(eTypeIsPointer)) + { + CompilerType pointee_type(valobj_type.GetPointeeType()); + Flags pointee_flags(pointee_type.GetTypeInfo()); + if (pointee_flags.AllSet(eTypeIsPointer)) + { + if (ProcessSP process_sp = valobj.GetProcessSP()) + { + Error error; + ptr_value = process_sp->ReadPointerFromMemory(ptr_value, error); + } + } + } + return ptr_value; + } + + return LLDB_INVALID_ADDRESS; +} +bool +lldb_private::formatters::NSError_SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) +{ + ProcessSP process_sp(valobj.GetProcessSP()); + if (!process_sp) + return false; + + lldb::addr_t ptr_value = DerefToNSErrorPointer(valobj); if (ptr_value == LLDB_INVALID_ADDRESS) return false; + size_t ptr_size = process_sp->GetAddressByteSize(); lldb::addr_t code_location = ptr_value + 2 * ptr_size; lldb::addr_t domain_location = ptr_value + 3 * ptr_size; @@ -135,18 +157,7 @@ public: if (!process_sp) return false; - lldb::addr_t userinfo_location = LLDB_INVALID_ADDRESS; - - CompilerType valobj_type(m_backend.GetCompilerType()); - Flags type_flags(valobj_type.GetTypeInfo()); - if (type_flags.AllClear(eTypeHasValue)) - { - if (m_backend.IsBaseClass() && m_backend.GetParent()) - userinfo_location = m_backend.GetParent()->GetValueAsUnsigned(LLDB_INVALID_ADDRESS); - } - else - userinfo_location = m_backend.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); - + lldb::addr_t userinfo_location = DerefToNSErrorPointer(m_backend); if (userinfo_location == LLDB_INVALID_ADDRESS) return false; @@ -158,10 +169,10 @@ public: if (userinfo == LLDB_INVALID_ADDRESS || error.Fail()) return false; InferiorSizedWord isw(userinfo,*process_sp); - m_child_sp = ValueObject::CreateValueObjectFromData("_userInfo", - isw.GetAsData(process_sp->GetByteOrder()), - m_backend.GetExecutionContextRef(), - process_sp->GetTarget().GetScratchClangASTContext()->GetBasicType(lldb::eBasicTypeObjCID)); + m_child_sp = CreateValueObjectFromData("_userInfo", + isw.GetAsData(process_sp->GetByteOrder()), + m_backend.GetExecutionContextRef(), + process_sp->GetTarget().GetScratchClangASTContext()->GetBasicType(lldb::eBasicTypeObjCID)); return false; } |