diff options
author | Enrico Granata <egranata@apple.com> | 2015-11-10 22:39:15 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2015-11-10 22:39:15 +0000 |
commit | 608d67c1520b9dd960f69a9137aab1ad78daae10 (patch) | |
tree | f0d99348e90f903d4824e614bd3bc7d9c8c67a2c /lldb/source/DataFormatters/ValueObjectPrinter.cpp | |
parent | 467ab052916ca820eb0332ec499446640b7e0d48 (diff) | |
download | bcm5719-llvm-608d67c1520b9dd960f69a9137aab1ad78daae10.tar.gz bcm5719-llvm-608d67c1520b9dd960f69a9137aab1ad78daae10.zip |
Introduce a way for Languages to specify whether values of "reference types" are "nil" (not pointing to anything) or uninitialized (never made to point at anything)
This latter determination may or may not be possible on a per-language basis; and neither is mandatory to implement for any language
Use this knowledge in the ValueObjectPrinter to generalize the notion of IsObjCNil() and the respective printout
llvm-svn: 252663
Diffstat (limited to 'lldb/source/DataFormatters/ValueObjectPrinter.cpp')
-rw-r--r-- | lldb/source/DataFormatters/ValueObjectPrinter.cpp | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/lldb/source/DataFormatters/ValueObjectPrinter.cpp b/lldb/source/DataFormatters/ValueObjectPrinter.cpp index 4bc33fdaa91..4289496c8ff 100644 --- a/lldb/source/DataFormatters/ValueObjectPrinter.cpp +++ b/lldb/source/DataFormatters/ValueObjectPrinter.cpp @@ -73,6 +73,7 @@ ValueObjectPrinter::Init (ValueObject* valobj, assert (m_stream && "cannot print to a NULL Stream"); m_should_print = eLazyBoolCalculate; m_is_nil = eLazyBoolCalculate; + m_is_uninit = eLazyBoolCalculate; m_is_ptr = eLazyBoolCalculate; m_is_ref = eLazyBoolCalculate; m_is_aggregate = eLazyBoolCalculate; @@ -100,12 +101,12 @@ ValueObjectPrinter::PrintValueObject () PrintDecl(); } - + bool value_printed = false; bool summary_printed = false; m_val_summary_ok = PrintValueAndSummaryIfNeeded (value_printed,summary_printed); - + if (m_val_summary_ok) PrintChildrenIfNeeded (value_printed, summary_printed); else @@ -194,8 +195,8 @@ const char* ValueObjectPrinter::GetRootNameForDisplay (const char* if_fail) { const char *root_valobj_name = m_options.m_root_valobj_name.empty() ? - m_valobj->GetName().AsCString() : - m_options.m_root_valobj_name.c_str(); + m_valobj->GetName().AsCString() : + m_options.m_root_valobj_name.c_str(); return root_valobj_name ? root_valobj_name : if_fail; } @@ -211,11 +212,19 @@ bool ValueObjectPrinter::IsNil () { if (m_is_nil == eLazyBoolCalculate) - m_is_nil = m_valobj->IsObjCNil() ? eLazyBoolYes : eLazyBoolNo; + m_is_nil = m_valobj->IsNilReference() ? eLazyBoolYes : eLazyBoolNo; return m_is_nil == eLazyBoolYes; } bool +ValueObjectPrinter::IsUninitialized () +{ + if (m_is_uninit == eLazyBoolCalculate) + m_is_uninit = m_valobj->IsUninitializedReference() ? eLazyBoolYes : eLazyBoolNo; + return m_is_uninit == eLazyBoolYes; +} + +bool ValueObjectPrinter::IsPtr () { if (m_is_ptr == eLazyBoolCalculate) @@ -426,6 +435,8 @@ ValueObjectPrinter::GetValueSummaryError (std::string& value, { if (IsNil()) summary.assign("nil"); + else if (IsUninitialized()) + summary.assign("<uninitialized>"); else if (m_options.m_omit_summary_depth == 0) { TypeSummaryImpl* entry = GetSummaryFormatter(); @@ -476,7 +487,7 @@ ValueObjectPrinter::PrintValueAndSummaryIfNeeded (bool& value_printed, // the value if this thing is nil // (but show the value if the user passes a format explicitly) TypeSummaryImpl* entry = GetSummaryFormatter(); - if (!IsNil() && !m_value.empty() && (entry == NULL || (entry->DoesPrintValue(m_valobj) || m_options.m_format != eFormatDefault) || m_summary.empty()) && !m_options.m_hide_value) + if (!IsNil() && !IsUninitialized() && !m_value.empty() && (entry == NULL || (entry->DoesPrintValue(m_valobj) || m_options.m_format != eFormatDefault) || m_summary.empty()) && !m_options.m_hide_value) { if (m_options.m_hide_pointer_value && IsPointerValue(m_valobj->GetCompilerType())) {} else @@ -503,7 +514,7 @@ ValueObjectPrinter::PrintObjectDescriptionIfNeeded (bool value_printed, if (ShouldPrintValueObject()) { // let's avoid the overly verbose no description error for a nil thing - if (m_options.m_use_objc && !IsNil()) + if (m_options.m_use_objc && !IsNil() && !IsUninitialized()) { if (!m_options.m_hide_value || !m_options.m_hide_name) m_stream->Printf(" "); @@ -571,6 +582,10 @@ ValueObjectPrinter::ShouldPrintChildren (bool is_failed_description, { const bool is_ref = IsRef (); const bool is_ptr = IsPtr (); + const bool is_uninit = IsUninitialized(); + + if (is_uninit) + return false; TypeSummaryImpl* entry = GetSummaryFormatter(); |