diff options
author | Enrico Granata <egranata@apple.com> | 2014-01-08 01:36:59 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2014-01-08 01:36:59 +0000 |
commit | 0dba9b33f0165a874e5bc05d7735293c52a7d250 (patch) | |
tree | 1450b1ba0067d29ef1a60ab972b1eeb6b0a94d58 /lldb/source/DataFormatters/LibCxx.cpp | |
parent | 8bcc086e586413b5f32385fca0a8f0c98c0ec1ca (diff) | |
download | bcm5719-llvm-0dba9b33f0165a874e5bc05d7735293c52a7d250.tar.gz bcm5719-llvm-0dba9b33f0165a874e5bc05d7735293c52a7d250.zip |
New and improved data formatter for std::shared_ptr<> and std::weak_ptr<>
llvm-svn: 198724
Diffstat (limited to 'lldb/source/DataFormatters/LibCxx.cpp')
-rw-r--r-- | lldb/source/DataFormatters/LibCxx.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lldb/source/DataFormatters/LibCxx.cpp b/lldb/source/DataFormatters/LibCxx.cpp index 1c799722fa4..6380d971a17 100644 --- a/lldb/source/DataFormatters/LibCxx.cpp +++ b/lldb/source/DataFormatters/LibCxx.cpp @@ -26,6 +26,51 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; +bool +lldb_private::formatters::LibcxxSmartPointerSummaryProvider (ValueObject& valobj, Stream& stream) +{ + ValueObjectSP valobj_sp(valobj.GetNonSyntheticValue()); + if (!valobj_sp) + return false; + ValueObjectSP ptr_sp(valobj_sp->GetChildMemberWithName(ConstString("__ptr_"), true)); + ValueObjectSP count_sp(valobj_sp->GetChildAtNamePath( {ConstString("__cntrl_"),ConstString("__shared_owners_")} )); + ValueObjectSP weakcount_sp(valobj_sp->GetChildAtNamePath( {ConstString("__cntrl_"),ConstString("__shared_weak_owners_")} )); + + if (!ptr_sp) + return false; + + if (ptr_sp->GetValueAsUnsigned(0) == 0) + { + stream.Printf("nullptr"); + return true; + } + else + { + bool print_pointee = false; + Error error; + ValueObjectSP pointee_sp = ptr_sp->Dereference(error); + if (pointee_sp && error.Success()) + { + if (pointee_sp->DumpPrintableRepresentation(stream, + ValueObject::eValueObjectRepresentationStyleSummary, + lldb::eFormatInvalid, + ValueObject::ePrintableRepresentationSpecialCasesDisable, + false)) + print_pointee = true; + } + if (!print_pointee) + stream.Printf("ptr = 0x%" PRIx64, ptr_sp->GetValueAsUnsigned(0)); + } + + if (count_sp) + stream.Printf(" strong=%" PRIu64, 1+count_sp->GetValueAsUnsigned(0)); + + if (weakcount_sp) + stream.Printf(" weak=%" PRIu64, 1+weakcount_sp->GetValueAsUnsigned(0)); + + return true; +} + lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : SyntheticChildrenFrontEnd(*valobj_sp.get()), m_bool_type(), |