[Lldb-commits] [lldb] r243301 - Add a more tweakable way for ValueObjectPrinter to control pointer expansion. NFC.

Enrico Granata egranata at apple.com
Mon Jul 27 11:34:14 PDT 2015


Author: enrico
Date: Mon Jul 27 13:34:14 2015
New Revision: 243301

URL: http://llvm.org/viewvc/llvm-project?rev=243301&view=rev
Log:
Add a more tweakable way for ValueObjectPrinter to control pointer expansion. NFC.


Modified:
    lldb/trunk/include/lldb/DataFormatters/ValueObjectPrinter.h
    lldb/trunk/source/DataFormatters/ValueObjectPrinter.cpp
    lldb/trunk/source/Interpreter/OptionGroupValueObjectDisplay.cpp

Modified: lldb/trunk/include/lldb/DataFormatters/ValueObjectPrinter.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/ValueObjectPrinter.h?rev=243301&r1=243300&r2=243301&view=diff
==============================================================================
--- lldb/trunk/include/lldb/DataFormatters/ValueObjectPrinter.h (original)
+++ lldb/trunk/include/lldb/DataFormatters/ValueObjectPrinter.h Mon Jul 27 13:34:14 2015
@@ -26,13 +26,42 @@ namespace lldb_private {
 
 struct DumpValueObjectOptions
 {
-    uint32_t m_max_ptr_depth = 0;
+    struct PointerDepth
+    {
+        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);
+    };
+
     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;
+    PointerDepth m_max_ptr_depth;
     bool m_use_synthetic : 1;
     bool m_scope_already_checked : 1;
     bool m_flat_output : 1;
@@ -50,6 +79,7 @@ struct DumpValueObjectOptions
     DumpValueObjectOptions() :
     m_summary_sp(),
     m_root_valobj_name(),
+    m_max_ptr_depth{PointerDepth::Mode::Default,0},
     m_use_synthetic(true),
     m_scope_already_checked(false),
     m_flat_output(false),
@@ -78,7 +108,7 @@ struct DumpValueObjectOptions
     DumpValueObjectOptions (ValueObject& valobj);
     
     DumpValueObjectOptions&
-    SetMaximumPointerDepth(uint32_t depth = 0)
+    SetMaximumPointerDepth(PointerDepth depth = {PointerDepth::Mode::Never,0})
     {
         m_max_ptr_depth = depth;
         return *this;
@@ -268,7 +298,7 @@ protected:
     ValueObjectPrinter (ValueObject* valobj,
                         Stream* s,
                         const DumpValueObjectOptions& options,
-                        uint32_t ptr_depth,
+                        const DumpValueObjectOptions::PointerDepth& ptr_depth,
                         uint32_t curr_depth);
     
     // we should actually be using delegating constructors here
@@ -277,7 +307,7 @@ protected:
     Init (ValueObject* valobj,
           Stream* s,
           const DumpValueObjectOptions& options,
-          uint32_t ptr_depth,
+          const DumpValueObjectOptions::PointerDepth& ptr_depth,
           uint32_t curr_depth);
     
     bool
@@ -343,7 +373,7 @@ protected:
     
     bool
     ShouldPrintChildren (bool is_failed_description,
-                         uint32_t& curr_ptr_depth);
+                         DumpValueObjectOptions::PointerDepth& curr_ptr_depth);
 
     bool
     ShouldExpandEmptyAggregates ();
@@ -359,13 +389,15 @@ protected:
     
     void
     PrintChild (lldb::ValueObjectSP child_sp,
-                uint32_t curr_ptr_depth);
+                const DumpValueObjectOptions::PointerDepth& curr_ptr_depth);
     
     uint32_t
     GetMaxNumChildrenToPrint (bool& print_dotdotdot);
     
     void
-    PrintChildren (uint32_t curr_ptr_depth);
+    PrintChildren (bool value_printed,
+                   bool summary_printed,
+                   const DumpValueObjectOptions::PointerDepth& curr_ptr_depth);
     
     void
     PrintChildrenIfNeeded (bool value_printed,
@@ -382,7 +414,7 @@ private:
     DumpValueObjectOptions options;
     Flags m_type_flags;
     ClangASTType m_clang_type;
-    uint32_t m_ptr_depth;
+    DumpValueObjectOptions::PointerDepth m_ptr_depth;
     uint32_t m_curr_depth;
     LazyBool m_should_print;
     LazyBool m_is_nil;

Modified: lldb/trunk/source/DataFormatters/ValueObjectPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/ValueObjectPrinter.cpp?rev=243301&r1=243300&r2=243301&view=diff
==============================================================================
--- lldb/trunk/source/DataFormatters/ValueObjectPrinter.cpp (original)
+++ lldb/trunk/source/DataFormatters/ValueObjectPrinter.cpp Mon Jul 27 13:34:14 2015
@@ -53,7 +53,7 @@ ValueObjectPrinter::ValueObjectPrinter (
 ValueObjectPrinter::ValueObjectPrinter (ValueObject* valobj,
                                         Stream* s,
                                         const DumpValueObjectOptions& options,
-                                        uint32_t ptr_depth,
+                                        const DumpValueObjectOptions::PointerDepth& ptr_depth,
                                         uint32_t curr_depth)
 {
     Init(valobj,s,options,ptr_depth,curr_depth);
@@ -63,7 +63,7 @@ void
 ValueObjectPrinter::Init (ValueObject* valobj,
                           Stream* s,
                           const DumpValueObjectOptions& options,
-                          uint32_t ptr_depth,
+                          const DumpValueObjectOptions::PointerDepth& ptr_depth,
                           uint32_t curr_depth)
 {
     m_orig_valobj = valobj;
@@ -437,12 +437,51 @@ ValueObjectPrinter::PrintObjectDescripti
 }
 
 bool
+DumpValueObjectOptions::PointerDepth::CanAllowExpansion (bool is_root,
+                                                         TypeSummaryImpl* entry,
+                                                         ValueObject *valobj,
+                                                         const std::string& summary)
+{
+    switch (m_mode)
+    {
+        case Mode::Always:
+            return (m_count > 0);
+        case Mode::Never:
+            return false;
+        case Mode::Default:
+            if (is_root)
+                m_count = std::min<decltype(m_count)>(m_count,1);
+            return m_count > 0;
+        case Mode::Formatters:
+            if (!entry || entry->DoesPrintChildren(valobj) || summary.empty())
+                return m_count > 0;
+            return false;
+    }
+}
+
+bool
+DumpValueObjectOptions::PointerDepth::CanAllowExpansion () const
+{
+    switch (m_mode)
+    {
+        case Mode::Always:
+        case Mode::Default:
+        case Mode::Formatters:
+            return (m_count > 0);
+        case Mode::Never:
+            return false;
+    }
+}
+
+bool
 ValueObjectPrinter::ShouldPrintChildren (bool is_failed_description,
-                                         uint32_t& curr_ptr_depth)
+                                         DumpValueObjectOptions::PointerDepth& curr_ptr_depth)
 {
     const bool is_ref = IsRef ();
     const bool is_ptr = IsPtr ();
 
+    TypeSummaryImpl* entry = GetSummaryFormatter();
+
     if (is_failed_description || m_curr_depth < options.m_max_depth)
     {
         // We will show children for all concrete types. We won't show
@@ -461,20 +500,21 @@ ValueObjectPrinter::ShouldPrintChildren
             if (m_valobj->GetPointerValue (&ptr_address_type) == 0)
                 return false;
             
-            else if (is_ref && m_curr_depth == 0 && curr_ptr_depth == 0)
+            const bool is_root_level = m_curr_depth == 0;
+            
+            if (is_ref &&
+                is_root_level)
             {
                 // If this is the root object (depth is zero) that we are showing
                 // and it is a reference, and no pointer depth has been supplied
                 // print out what it references. Don't do this at deeper depths
                 // otherwise we can end up with infinite recursion...
-                curr_ptr_depth = 1;
+                return true;
             }
             
-            return (curr_ptr_depth > 0);
+            return curr_ptr_depth.CanAllowExpansion(false, entry, m_valobj, m_summary);
         }
         
-        TypeSummaryImpl* entry = GetSummaryFormatter();
-
         return (!entry || entry->DoesPrintChildren(m_valobj) || m_summary.empty());
     }
     return false;
@@ -515,7 +555,7 @@ ValueObjectPrinter::PrintChildrenPreambl
 
 void
 ValueObjectPrinter::PrintChild (ValueObjectSP child_sp,
-                                uint32_t curr_ptr_depth)
+                                const DumpValueObjectOptions::PointerDepth& curr_ptr_depth)
 {
     DumpValueObjectOptions child_options(options);
     child_options.SetFormat(options.m_format).SetSummary().SetRootValueObjectName();
@@ -526,11 +566,10 @@ ValueObjectPrinter::PrintChild (ValueObj
         ValueObjectPrinter child_printer(child_sp.get(),
                                          m_stream,
                                          child_options,
-                                         (IsPtr() || IsRef()) && curr_ptr_depth >= 1 ? curr_ptr_depth - 1 : curr_ptr_depth,
+                                         (IsPtr() || IsRef()) ? --curr_ptr_depth : curr_ptr_depth,
                                          m_curr_depth + 1);
         child_printer.PrintValueObject();
     }
-
 }
 
 uint32_t
@@ -569,7 +608,9 @@ ValueObjectPrinter::PrintChildrenPostamb
 }
 
 void
-ValueObjectPrinter::PrintChildren (uint32_t curr_ptr_depth)
+ValueObjectPrinter::PrintChildren (bool value_printed,
+                                   bool summary_printed,
+                                   const DumpValueObjectOptions::PointerDepth& curr_ptr_depth)
 {
     ValueObject* synth_m_valobj = GetValueObjectForChildrenGeneration();
     
@@ -662,9 +703,9 @@ ValueObjectPrinter::PrintChildrenIfNeede
     // if that happens, we want to display the children, if any
     bool is_failed_description = !PrintObjectDescriptionIfNeeded(value_printed, summary_printed);
     
-    uint32_t curr_ptr_depth = m_ptr_depth;
+    auto curr_ptr_depth = m_ptr_depth;
     bool print_children = ShouldPrintChildren (is_failed_description,curr_ptr_depth);
-    bool print_oneline = (curr_ptr_depth > 0 ||
+    bool print_oneline = (curr_ptr_depth.CanAllowExpansion() ||
                           options.m_show_types ||
                           !options.m_allow_oneliner_mode ||
                           options.m_flat_output ||
@@ -679,7 +720,7 @@ ValueObjectPrinter::PrintChildrenIfNeede
             m_stream->EOL();
         }
         else
-            PrintChildren (curr_ptr_depth);
+            PrintChildren (value_printed, summary_printed, curr_ptr_depth);
     }
     else if (m_curr_depth >= options.m_max_depth && IsAggregate() && ShouldPrintValueObject())
     {

Modified: lldb/trunk/source/Interpreter/OptionGroupValueObjectDisplay.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/OptionGroupValueObjectDisplay.cpp?rev=243301&r1=243300&r2=243301&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/OptionGroupValueObjectDisplay.cpp (original)
+++ lldb/trunk/source/Interpreter/OptionGroupValueObjectDisplay.cpp Mon Jul 27 13:34:14 2015
@@ -162,7 +162,7 @@ OptionGroupValueObjectDisplay::GetAsDump
                                                  lldb::TypeSummaryImplSP summary_sp)
 {
     DumpValueObjectOptions options;
-    options.SetMaximumPointerDepth(ptr_depth);
+    options.SetMaximumPointerDepth( {DumpValueObjectOptions::PointerDepth::Mode::Always,ptr_depth} );
     if (use_objc)
         options.SetShowSummary(false);
     else





More information about the lldb-commits mailing list