[Lldb-commits] [lldb] r252638 - Upstream changes to the ValueObjectPrinter; nfc
Enrico Granata via lldb-commits
lldb-commits at lists.llvm.org
Tue Nov 10 11:07:58 PST 2015
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();
More information about the lldb-commits
mailing list