Author: enrico Date: Tue Nov 10 13:07:58 2015 New Revision: 252638 URL: http://llvm.org/viewvc/llvm-project?rev=252638&view=rev Log: Upstream changes to the ValueObjectPrinter; nfc
Modified: lldb/trunk/include/lldb/DataFormatters/DumpValueObjectOptions.h lldb/trunk/include/lldb/DataFormatters/ValueObjectPrinter.h lldb/trunk/source/DataFormatters/DumpValueObjectOptions.cpp lldb/trunk/source/DataFormatters/ValueObjectPrinter.cpp Modified: lldb/trunk/include/lldb/DataFormatters/DumpValueObjectOptions.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/DumpValueObjectOptions.h?rev=252638&r1=252637&r2=252638&view=diff ============================================================================== --- lldb/trunk/include/lldb/DataFormatters/DumpValueObjectOptions.h (original) +++ lldb/trunk/include/lldb/DataFormatters/DumpValueObjectOptions.h Tue Nov 10 13:07:58 2015 @@ -24,157 +24,162 @@ namespace lldb_private { -class DumpValueObjectOptions -{ -public: - struct PointerDepth + class DumpValueObjectOptions { - enum class Mode + public: + struct PointerDepth { - Always, - Formatters, - Default, - Never - } m_mode; - uint32_t m_count; + enum class Mode + { + Always, + Formatters, + Default, + Never + } m_mode; + uint32_t m_count; + + PointerDepth + operator --() const + { + if (m_count > 0) + return PointerDepth {m_mode,m_count-1}; + return PointerDepth {m_mode,m_count}; + } + + bool + CanAllowExpansion () const; + + bool + CanAllowExpansion (bool is_root, + TypeSummaryImpl* entry, + ValueObject *valobj, + const std::string& summary); + }; - PointerDepth - operator --() const + typedef std::function<bool(ConstString, + ConstString, + const DumpValueObjectOptions &, + Stream&)> DeclPrintingHelper; + + static const DumpValueObjectOptions + DefaultOptions() { - if (m_count > 0) - return PointerDepth {m_mode,m_count-1}; - return PointerDepth {m_mode,m_count}; + static DumpValueObjectOptions g_default_options; + + return g_default_options; } - bool - CanAllowExpansion () const; + DumpValueObjectOptions(); - bool - CanAllowExpansion (bool is_root, - TypeSummaryImpl* entry, - ValueObject *valobj, - const std::string& summary); - }; - - typedef std::function<bool(ConstString, - ConstString, - const DumpValueObjectOptions &, - Stream&)> DeclPrintingHelper; - - static const DumpValueObjectOptions - DefaultOptions() - { - static DumpValueObjectOptions g_default_options; + DumpValueObjectOptions (const DumpValueObjectOptions& rhs) = default; - return g_default_options; - } - - DumpValueObjectOptions(); - - DumpValueObjectOptions (const DumpValueObjectOptions& rhs) = default; - - DumpValueObjectOptions (ValueObject& valobj); - - DumpValueObjectOptions& - SetMaximumPointerDepth(PointerDepth depth = {PointerDepth::Mode::Never,0}); - - DumpValueObjectOptions& - SetMaximumDepth(uint32_t depth = 0); - - DumpValueObjectOptions& - SetDeclPrintingHelper(DeclPrintingHelper helper); - - DumpValueObjectOptions& - SetShowTypes(bool show = false); - - DumpValueObjectOptions& - SetShowLocation(bool show = false); - - DumpValueObjectOptions& - SetUseObjectiveC(bool use = false); - - DumpValueObjectOptions& - SetShowSummary(bool show = true); - - DumpValueObjectOptions& - SetUseDynamicType(lldb::DynamicValueType dyn = lldb::eNoDynamicValues); - - DumpValueObjectOptions& - SetUseSyntheticValue(bool use_synthetic = true); - - DumpValueObjectOptions& - SetScopeChecked(bool check = true); - - DumpValueObjectOptions& - SetFlatOutput(bool flat = false); - - DumpValueObjectOptions& - SetOmitSummaryDepth(uint32_t depth = 0); - - DumpValueObjectOptions& - SetIgnoreCap(bool ignore = false); - - DumpValueObjectOptions& - SetRawDisplay(); - - DumpValueObjectOptions& - SetFormat (lldb::Format format = lldb::eFormatDefault); - - DumpValueObjectOptions& - SetSummary (lldb::TypeSummaryImplSP summary = lldb::TypeSummaryImplSP()); - - DumpValueObjectOptions& - SetRootValueObjectName(const char* name = nullptr); - - DumpValueObjectOptions& - SetHideRootType (bool hide_root_type = false); - - DumpValueObjectOptions& - SetHideName (bool hide_name = false); - - DumpValueObjectOptions& - SetHideValue (bool hide_value = false); - - DumpValueObjectOptions& - SetHidePointerValue (bool hide = false); - - DumpValueObjectOptions& - SetVariableFormatDisplayLanguage (lldb::LanguageType lang = lldb::eLanguageTypeUnknown); - - DumpValueObjectOptions& - SetRunValidator (bool run = true); + DumpValueObjectOptions (ValueObject& valobj); + + DumpValueObjectOptions& + SetMaximumPointerDepth(PointerDepth depth = {PointerDepth::Mode::Never,0}); + + DumpValueObjectOptions& + SetMaximumDepth(uint32_t depth = 0); + + DumpValueObjectOptions& + SetDeclPrintingHelper(DeclPrintingHelper helper); + + DumpValueObjectOptions& + SetShowTypes(bool show = false); + + DumpValueObjectOptions& + SetShowLocation(bool show = false); + + DumpValueObjectOptions& + SetUseObjectiveC(bool use = false); + + DumpValueObjectOptions& + SetShowSummary(bool show = true); + + DumpValueObjectOptions& + SetUseDynamicType(lldb::DynamicValueType dyn = lldb::eNoDynamicValues); + + DumpValueObjectOptions& + SetUseSyntheticValue(bool use_synthetic = true); + + DumpValueObjectOptions& + SetScopeChecked(bool check = true); + + DumpValueObjectOptions& + SetFlatOutput(bool flat = false); + + DumpValueObjectOptions& + SetOmitSummaryDepth(uint32_t depth = 0); + + DumpValueObjectOptions& + SetIgnoreCap(bool ignore = false); + + DumpValueObjectOptions& + SetRawDisplay(); + + DumpValueObjectOptions& + SetFormat (lldb::Format format = lldb::eFormatDefault); + + DumpValueObjectOptions& + SetSummary (lldb::TypeSummaryImplSP summary = lldb::TypeSummaryImplSP()); + + DumpValueObjectOptions& + SetRootValueObjectName(const char* name = nullptr); + + DumpValueObjectOptions& + SetHideRootType (bool hide_root_type = false); + + DumpValueObjectOptions& + SetHideName (bool hide_name = false); + + DumpValueObjectOptions& + SetHideValue (bool hide_value = false); + + DumpValueObjectOptions& + SetHidePointerValue (bool hide = false); + + DumpValueObjectOptions& + SetVariableFormatDisplayLanguage (lldb::LanguageType lang = lldb::eLanguageTypeUnknown); + + DumpValueObjectOptions& + SetRunValidator (bool run = true); + + DumpValueObjectOptions& + SetUseTypeDisplayName (bool dis = false); + + DumpValueObjectOptions& + SetAllowOnelinerMode (bool oneliner = false); + + DumpValueObjectOptions& + SetRevealEmptyAggregates (bool reveal = true); + + public: + uint32_t m_max_depth = UINT32_MAX; + lldb::DynamicValueType m_use_dynamic = lldb::eNoDynamicValues; + uint32_t m_omit_summary_depth = 0; + lldb::Format m_format = lldb::eFormatDefault; + lldb::TypeSummaryImplSP m_summary_sp; + std::string m_root_valobj_name; + lldb::LanguageType m_varformat_language = lldb::eLanguageTypeUnknown; + PointerDepth m_max_ptr_depth; + DeclPrintingHelper m_decl_printing_helper; + bool m_use_synthetic : 1; + bool m_scope_already_checked : 1; + bool m_flat_output : 1; + bool m_ignore_cap : 1; + bool m_show_types : 1; + bool m_show_location : 1; + bool m_use_objc : 1; + bool m_hide_root_type : 1; + bool m_hide_name : 1; + bool m_hide_value : 1; + bool m_run_validator : 1; + bool m_use_type_display_name : 1; + bool m_allow_oneliner_mode : 1; + bool m_hide_pointer_value : 1; + bool m_reveal_empty_aggregates : 1; + }; - DumpValueObjectOptions& - SetUseTypeDisplayName (bool dis = false); - - DumpValueObjectOptions& - SetAllowOnelinerMode (bool oneliner = false); - - uint32_t m_max_depth = UINT32_MAX; - lldb::DynamicValueType m_use_dynamic = lldb::eNoDynamicValues; - uint32_t m_omit_summary_depth = 0; - lldb::Format m_format = lldb::eFormatDefault; - lldb::TypeSummaryImplSP m_summary_sp; - std::string m_root_valobj_name; - lldb::LanguageType m_varformat_language = lldb::eLanguageTypeUnknown; - PointerDepth m_max_ptr_depth; - DeclPrintingHelper m_decl_printing_helper; - bool m_use_synthetic : 1; - bool m_scope_already_checked : 1; - bool m_flat_output : 1; - bool m_ignore_cap : 1; - bool m_show_types : 1; - bool m_show_location : 1; - bool m_use_objc : 1; - bool m_hide_root_type : 1; - bool m_hide_name : 1; - bool m_hide_value : 1; - bool m_run_validator : 1; - bool m_use_type_display_name : 1; - bool m_allow_oneliner_mode : 1; - bool m_hide_pointer_value : 1; -}; - } // namespace lldb_private #endif // lldb_DumpValueObjectOptions_h_ Modified: lldb/trunk/include/lldb/DataFormatters/ValueObjectPrinter.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/ValueObjectPrinter.h?rev=252638&r1=252637&r2=252638&view=diff ============================================================================== --- lldb/trunk/include/lldb/DataFormatters/ValueObjectPrinter.h (original) +++ lldb/trunk/include/lldb/DataFormatters/ValueObjectPrinter.h Tue Nov 10 13:07:58 2015 @@ -22,161 +22,180 @@ #include "lldb/DataFormatters/DumpValueObjectOptions.h" #include "lldb/Symbol/CompilerType.h" -namespace lldb_private { - -class ValueObjectPrinter -{ -public: - - ValueObjectPrinter (ValueObject* valobj, - Stream* s); - - ValueObjectPrinter (ValueObject* valobj, - Stream* s, - const DumpValueObjectOptions& options); - - ~ValueObjectPrinter () {} - - bool - PrintValueObject (); - -protected: - - // only this class (and subclasses, if any) should ever be concerned with - // the depth mechanism - ValueObjectPrinter (ValueObject* valobj, - Stream* s, - const DumpValueObjectOptions& options, - const DumpValueObjectOptions::PointerDepth& ptr_depth, - uint32_t curr_depth); - - // we should actually be using delegating constructors here - // but some versions of GCC still have trouble with those - void - Init (ValueObject* valobj, - Stream* s, - const DumpValueObjectOptions& options, - const DumpValueObjectOptions::PointerDepth& ptr_depth, - uint32_t curr_depth); - - bool - GetMostSpecializedValue (); - - const char* - GetDescriptionForDisplay (); - - const char* - GetRootNameForDisplay (const char* if_fail = nullptr); - - bool - ShouldPrintValueObject (); - - bool - ShouldPrintValidation (); - - bool - IsNil (); - - bool - IsPtr (); - - bool - IsRef (); - - bool - IsAggregate (); - - bool - PrintValidationMarkerIfNeeded (); - - bool - PrintValidationErrorIfNeeded (); - - bool - PrintLocationIfNeeded (); - - void - PrintDecl (); - - bool - CheckScopeIfNeeded (); - - TypeSummaryImpl* - GetSummaryFormatter (); - - void - GetValueSummaryError (std::string& value, - std::string& summary, - std::string& error); - - bool - PrintValueAndSummaryIfNeeded (bool& value_printed, - bool& summary_printed); - - bool - PrintObjectDescriptionIfNeeded (bool value_printed, - bool summary_printed); - - bool - ShouldPrintChildren (bool is_failed_description, - DumpValueObjectOptions::PointerDepth& curr_ptr_depth); +//#include <functional> +//#include <memory> +//#include <set> - bool - ShouldExpandEmptyAggregates (); - - ValueObject* - GetValueObjectForChildrenGeneration (); - - void - PrintChildrenPreamble (); - - void - PrintChildrenPostamble (bool print_dotdotdot); - - void - PrintChild (lldb::ValueObjectSP child_sp, - const DumpValueObjectOptions::PointerDepth& curr_ptr_depth); - - uint32_t - GetMaxNumChildrenToPrint (bool& print_dotdotdot); - - void - PrintChildren (bool value_printed, - bool summary_printed, - const DumpValueObjectOptions::PointerDepth& curr_ptr_depth); - - void - PrintChildrenIfNeeded (bool value_printed, - bool summary_printed); - - bool - PrintChildrenOneLiner (bool hide_names); - -private: - - ValueObject *m_orig_valobj; - ValueObject *m_valobj; - Stream *m_stream; - DumpValueObjectOptions m_options; - Flags m_type_flags; - CompilerType m_compiler_type; - DumpValueObjectOptions::PointerDepth m_ptr_depth; - uint32_t m_curr_depth; - LazyBool m_should_print; - LazyBool m_is_nil; - LazyBool m_is_ptr; - LazyBool m_is_ref; - LazyBool m_is_aggregate; - std::pair<TypeSummaryImpl*,bool> m_summary_formatter; - std::string m_value; - std::string m_summary; - std::string m_error; - std::pair<TypeValidatorResult,std::string> m_validation; - - friend struct StringSummaryFormat; +namespace lldb_private { - DISALLOW_COPY_AND_ASSIGN(ValueObjectPrinter); -}; + class ValueObjectPrinter + { + public: + + ValueObjectPrinter (ValueObject* valobj, + Stream* s); + + ValueObjectPrinter (ValueObject* valobj, + Stream* s, + const DumpValueObjectOptions& options); + + ~ValueObjectPrinter () {} + + bool + PrintValueObject (); + + protected: + typedef std::set<uint64_t> InstancePointersSet; + typedef std::shared_ptr<InstancePointersSet> InstancePointersSetSP; + + InstancePointersSetSP m_printed_instance_pointers; + + // only this class (and subclasses, if any) should ever be concerned with + // the depth mechanism + ValueObjectPrinter (ValueObject* valobj, + Stream* s, + const DumpValueObjectOptions& options, + const DumpValueObjectOptions::PointerDepth& ptr_depth, + uint32_t curr_depth, + InstancePointersSetSP printed_instance_pointers); + + // we should actually be using delegating constructors here + // but some versions of GCC still have trouble with those + void + Init (ValueObject* valobj, + Stream* s, + const DumpValueObjectOptions& options, + const DumpValueObjectOptions::PointerDepth& ptr_depth, + uint32_t curr_depth, + InstancePointersSetSP printed_instance_pointers); + + bool + GetMostSpecializedValue (); + + const char* + GetDescriptionForDisplay (); + + const char* + GetRootNameForDisplay (const char* if_fail = nullptr); + + bool + ShouldPrintValueObject (); + + bool + ShouldPrintValidation (); + + bool + IsNil (); + + bool + IsPtr (); + + bool + IsRef (); + + bool + IsInstancePointer (); + + bool + IsAggregate (); + + bool + PrintValidationMarkerIfNeeded (); + + bool + PrintValidationErrorIfNeeded (); + + bool + PrintLocationIfNeeded (); + + void + PrintDecl (); + + bool + CheckScopeIfNeeded (); + + bool + ShouldPrintEmptyBrackets (bool value_printed, + bool summary_printed); + + TypeSummaryImpl* + GetSummaryFormatter (bool null_if_omitted = true); + + void + GetValueSummaryError (std::string& value, + std::string& summary, + std::string& error); + + bool + PrintValueAndSummaryIfNeeded (bool& value_printed, + bool& summary_printed); + + bool + PrintObjectDescriptionIfNeeded (bool value_printed, + bool summary_printed); + + bool + ShouldPrintChildren (bool is_failed_description, + DumpValueObjectOptions::PointerDepth& curr_ptr_depth); + + bool + ShouldExpandEmptyAggregates (); + + ValueObject* + GetValueObjectForChildrenGeneration (); + + void + PrintChildrenPreamble (); + + void + PrintChildrenPostamble (bool print_dotdotdot); + + void + PrintChild (lldb::ValueObjectSP child_sp, + const DumpValueObjectOptions::PointerDepth& curr_ptr_depth); + + uint32_t + GetMaxNumChildrenToPrint (bool& print_dotdotdot); + + void + PrintChildren (bool value_printed, + bool summary_printed, + const DumpValueObjectOptions::PointerDepth& curr_ptr_depth); + + void + PrintChildrenIfNeeded (bool value_printed, + bool summary_printed); + + bool + PrintChildrenOneLiner (bool hide_names); + + private: + + ValueObject *m_orig_valobj; + ValueObject *m_valobj; + Stream *m_stream; + DumpValueObjectOptions m_options; + Flags m_type_flags; + CompilerType m_compiler_type; + DumpValueObjectOptions::PointerDepth m_ptr_depth; + uint32_t m_curr_depth; + LazyBool m_should_print; + LazyBool m_is_nil; + LazyBool m_is_ptr; + LazyBool m_is_ref; + LazyBool m_is_aggregate; + LazyBool m_is_instance_ptr; + std::pair<TypeSummaryImpl*,bool> m_summary_formatter; + std::string m_value; + std::string m_summary; + std::string m_error; + bool m_val_summary_ok; + std::pair<TypeValidatorResult,std::string> m_validation; + + friend struct StringSummaryFormat; + + DISALLOW_COPY_AND_ASSIGN(ValueObjectPrinter); + }; } // namespace lldb_private Modified: lldb/trunk/source/DataFormatters/DumpValueObjectOptions.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/DumpValueObjectOptions.cpp?rev=252638&r1=252637&r2=252638&view=diff ============================================================================== --- lldb/trunk/source/DataFormatters/DumpValueObjectOptions.cpp (original) +++ lldb/trunk/source/DataFormatters/DumpValueObjectOptions.cpp Tue Nov 10 13:07:58 2015 @@ -19,29 +19,30 @@ using namespace lldb; using namespace lldb_private; DumpValueObjectOptions::DumpValueObjectOptions() : - m_summary_sp(), - m_root_valobj_name(), - m_max_ptr_depth(PointerDepth{PointerDepth::Mode::Default,0}), - m_decl_printing_helper(), - m_use_synthetic(true), - m_scope_already_checked(false), - m_flat_output(false), - m_ignore_cap(false), - m_show_types(false), - m_show_location(false), - m_use_objc(false), - m_hide_root_type(false), - m_hide_name(false), - m_hide_value(false), - m_run_validator(false), - m_use_type_display_name(true), - m_allow_oneliner_mode(true), - m_hide_pointer_value(false) +m_summary_sp(), +m_root_valobj_name(), +m_max_ptr_depth(PointerDepth{PointerDepth::Mode::Default,0}), +m_decl_printing_helper(), +m_use_synthetic(true), +m_scope_already_checked(false), +m_flat_output(false), +m_ignore_cap(false), +m_show_types(false), +m_show_location(false), +m_use_objc(false), +m_hide_root_type(false), +m_hide_name(false), +m_hide_value(false), +m_run_validator(false), +m_use_type_display_name(true), +m_allow_oneliner_mode(true), +m_hide_pointer_value(false), +m_reveal_empty_aggregates(true) {} DumpValueObjectOptions::DumpValueObjectOptions (ValueObject& valobj) : - DumpValueObjectOptions() +DumpValueObjectOptions() { m_use_dynamic = valobj.GetDynamicValueType(); m_use_synthetic = valobj.IsSynthetic(); @@ -234,3 +235,11 @@ DumpValueObjectOptions::SetAllowOneliner m_allow_oneliner_mode = oneliner; return *this; } + +DumpValueObjectOptions& +DumpValueObjectOptions::SetRevealEmptyAggregates (bool reveal) +{ + m_reveal_empty_aggregates = reveal; + return *this; +} + Modified: lldb/trunk/source/DataFormatters/ValueObjectPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/ValueObjectPrinter.cpp?rev=252638&r1=252637&r2=252638&view=diff ============================================================================== --- lldb/trunk/source/DataFormatters/ValueObjectPrinter.cpp (original) +++ lldb/trunk/source/DataFormatters/ValueObjectPrinter.cpp Tue Nov 10 13:07:58 2015 @@ -29,12 +29,12 @@ ValueObjectPrinter::ValueObjectPrinter ( if (valobj) { DumpValueObjectOptions options(*valobj); - Init (valobj,s,options,m_options.m_max_ptr_depth,0); + Init (valobj,s,options,m_options.m_max_ptr_depth,0, nullptr); } else { DumpValueObjectOptions options; - Init (valobj,s,options,m_options.m_max_ptr_depth,0); + Init (valobj,s,options,m_options.m_max_ptr_depth,0, nullptr); } } @@ -42,16 +42,17 @@ ValueObjectPrinter::ValueObjectPrinter ( Stream* s, const DumpValueObjectOptions& options) { - Init(valobj,s,options,m_options.m_max_ptr_depth,0); + Init(valobj,s,options,m_options.m_max_ptr_depth,0, nullptr); } ValueObjectPrinter::ValueObjectPrinter (ValueObject* valobj, Stream* s, const DumpValueObjectOptions& options, const DumpValueObjectOptions::PointerDepth& ptr_depth, - uint32_t curr_depth) + uint32_t curr_depth, + InstancePointersSetSP printed_instance_pointers) { - Init(valobj,s,options,ptr_depth,curr_depth); + Init(valobj,s,options,ptr_depth,curr_depth, printed_instance_pointers); } void @@ -59,7 +60,8 @@ ValueObjectPrinter::Init (ValueObject* v Stream* s, const DumpValueObjectOptions& options, const DumpValueObjectOptions::PointerDepth& ptr_depth, - uint32_t curr_depth) + uint32_t curr_depth, + InstancePointersSetSP printed_instance_pointers) { m_orig_valobj = valobj; m_valobj = nullptr; @@ -74,10 +76,13 @@ ValueObjectPrinter::Init (ValueObject* v m_is_ptr = eLazyBoolCalculate; m_is_ref = eLazyBoolCalculate; m_is_aggregate = eLazyBoolCalculate; + m_is_instance_ptr = eLazyBoolCalculate; m_summary_formatter = {nullptr,false}; m_value.assign(""); m_summary.assign(""); m_error.assign(""); + m_val_summary_ok = false; + m_printed_instance_pointers = printed_instance_pointers ? printed_instance_pointers : InstancePointersSetSP(new InstancePointersSet()); } bool @@ -95,13 +100,13 @@ ValueObjectPrinter::PrintValueObject () PrintDecl(); } - + bool value_printed = false; bool summary_printed = false; - bool val_summary_ok = PrintValueAndSummaryIfNeeded (value_printed,summary_printed); - - if (val_summary_ok) + m_val_summary_ok = PrintValueAndSummaryIfNeeded (value_printed,summary_printed); + + if (m_val_summary_ok) PrintChildrenIfNeeded (value_printed, summary_printed); else m_stream->EOL(); @@ -189,8 +194,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; } @@ -235,6 +240,17 @@ ValueObjectPrinter::IsAggregate () } bool +ValueObjectPrinter::IsInstancePointer () +{ + // you need to do this check on the value's clang type + if (m_is_instance_ptr == eLazyBoolCalculate) + m_is_instance_ptr = (m_valobj->GetValue().GetCompilerType().GetTypeInfo() & eTypeInstanceIsPointer) != 0 ? eLazyBoolYes : eLazyBoolNo; + if ((eLazyBoolYes == m_is_instance_ptr) && m_valobj->IsBaseClass()) + m_is_instance_ptr = eLazyBoolNo; + return m_is_instance_ptr == eLazyBoolYes; +} + +bool ValueObjectPrinter::PrintLocationIfNeeded () { if (m_options.m_show_location) @@ -361,7 +377,7 @@ ValueObjectPrinter::CheckScopeIfNeeded ( } TypeSummaryImpl* -ValueObjectPrinter::GetSummaryFormatter () +ValueObjectPrinter::GetSummaryFormatter (bool null_if_omitted) { if (m_summary_formatter.second == false) { @@ -372,6 +388,8 @@ ValueObjectPrinter::GetSummaryFormatter m_summary_formatter.first = entry; m_summary_formatter.second = true; } + if (m_options.m_omit_summary_depth > 0 && null_if_omitted) + return nullptr; return m_summary_formatter.first; } @@ -379,7 +397,7 @@ static bool IsPointerValue (const CompilerType &type) { Flags type_flags(type.GetTypeInfo()); - if (type_flags.AnySet(eTypeIsPointer)) + if (type_flags.AnySet(eTypeInstanceIsPointer | eTypeIsPointer)) return type_flags.AllClear(eTypeIsBuiltIn); return false; } @@ -438,6 +456,16 @@ ValueObjectPrinter::PrintValueAndSummary } if (m_error.size()) { + // we need to support scenarios in which it is actually fine for a value to have no type + // but - on the other hand - if we get an error *AND* have no type, we try to get out + // gracefully, since most often that combination means "could not resolve a type" + // and the default failure mode is quite ugly + if (!m_compiler_type.IsValid()) + { + m_stream->Printf(" <could not resolve type>"); + return false; + } + error_printed = true; m_stream->Printf (" <%s>\n", m_error.c_str()); } @@ -543,9 +571,12 @@ ValueObjectPrinter::ShouldPrintChildren { const bool is_ref = IsRef (); const bool is_ptr = IsPtr (); - + TypeSummaryImpl* entry = GetSummaryFormatter(); - + + if (m_options.m_use_objc) + return false; + if (is_failed_description || m_curr_depth < m_options.m_max_depth) { // We will show children for all concrete types. We won't show @@ -588,10 +619,10 @@ bool ValueObjectPrinter::ShouldExpandEmptyAggregates () { TypeSummaryImpl* entry = GetSummaryFormatter(); - + if (!entry) return true; - + return entry->DoesPrintEmptyAggregates(); } @@ -625,13 +656,15 @@ ValueObjectPrinter::PrintChild (ValueObj child_options.SetFormat(m_options.m_format).SetSummary().SetRootValueObjectName(); child_options.SetScopeChecked(true).SetHideName(m_options.m_hide_name).SetHideValue(m_options.m_hide_value) .SetOmitSummaryDepth(child_options.m_omit_summary_depth > 1 ? child_options.m_omit_summary_depth - 1 : 0); + if (child_sp.get()) { ValueObjectPrinter child_printer(child_sp.get(), m_stream, child_options, (IsPtr() || IsRef()) ? --curr_ptr_depth : curr_ptr_depth, - m_curr_depth + 1); + m_curr_depth + 1, + m_printed_instance_pointers); child_printer.PrintValueObject(); } } @@ -671,6 +704,30 @@ ValueObjectPrinter::PrintChildrenPostamb } } +bool +ValueObjectPrinter::ShouldPrintEmptyBrackets (bool value_printed, + bool summary_printed) +{ + ValueObject* synth_m_valobj = GetValueObjectForChildrenGeneration(); + + if (!IsAggregate()) + return false; + + if (m_options.m_reveal_empty_aggregates == false) + { + if (value_printed || summary_printed) + return false; + } + + if (synth_m_valobj->MightHaveChildren()) + return true; + + if (m_val_summary_ok) + return false; + + return true; +} + void ValueObjectPrinter::PrintChildren (bool value_printed, bool summary_printed, @@ -682,17 +739,38 @@ ValueObjectPrinter::PrintChildren (bool size_t num_children = GetMaxNumChildrenToPrint(print_dotdotdot); if (num_children) { - PrintChildrenPreamble (); + bool any_children_printed = false; for (size_t idx=0; idx<num_children; ++idx) { ValueObjectSP child_sp(synth_m_valobj->GetChildAtIndex(idx, true)); - PrintChild (child_sp, curr_ptr_depth); + if (child_sp) + { + if (!any_children_printed) + { + PrintChildrenPreamble (); + any_children_printed = true; + } + PrintChild (child_sp, curr_ptr_depth); + } } - PrintChildrenPostamble (print_dotdotdot); + if (any_children_printed) + PrintChildrenPostamble (print_dotdotdot); + else + { + if (ShouldPrintEmptyBrackets(value_printed, summary_printed)) + { + if (ShouldPrintValueObject()) + m_stream->PutCString(" {}\n"); + else + m_stream->EOL(); + } + else + m_stream->EOL(); + } } - else if (IsAggregate()) + else if (ShouldPrintEmptyBrackets(value_printed, summary_printed)) { // Aggregate, no children... if (ShouldPrintValueObject()) @@ -774,6 +852,23 @@ ValueObjectPrinter::PrintChildrenIfNeede !m_options.m_allow_oneliner_mode || m_options.m_flat_output || m_options.m_show_location) ? false : DataVisualization::ShouldPrintAsOneLiner(*m_valobj); + bool is_instance_ptr = IsInstancePointer(); + uint64_t instance_ptr_value = LLDB_INVALID_ADDRESS; + + if (print_children && is_instance_ptr) + { + instance_ptr_value = m_valobj->GetValueAsUnsigned(0); + if (m_printed_instance_pointers->count(instance_ptr_value)) + { + // we already printed this instance-is-pointer thing, so don't expand it + m_stream->PutCString(" {...}\n"); + + // we're done here - get out fast + return; + } + else + m_printed_instance_pointers->emplace(instance_ptr_value); // remember this guy for future reference + } if (print_children) { @@ -788,7 +883,7 @@ ValueObjectPrinter::PrintChildrenIfNeede } else if (m_curr_depth >= m_options.m_max_depth && IsAggregate() && ShouldPrintValueObject()) { - m_stream->PutCString("{...}\n"); + m_stream->PutCString("{...}\n"); } else m_stream->EOL(); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits