diff options
-rw-r--r-- | lldb/examples/synthetic/bitfield/example.py | 6 | ||||
-rw-r--r-- | lldb/examples/synthetic/gnu_libstdcpp.py | 27 | ||||
-rw-r--r-- | lldb/examples/synthetic/libcxx.py | 37 | ||||
-rw-r--r-- | lldb/source/Core/CXXFormatterFunctions.cpp | 16 |
4 files changed, 82 insertions, 4 deletions
diff --git a/lldb/examples/synthetic/bitfield/example.py b/lldb/examples/synthetic/bitfield/example.py index f32d4071566..7995919a490 100644 --- a/lldb/examples/synthetic/bitfield/example.py +++ b/lldb/examples/synthetic/bitfield/example.py @@ -13,6 +13,12 @@ class MaskedData_SyntheticChildrenProvider: # answer questions about N children return 4 + def has_children(self): + # we simply say True here because we know we have 4 children + # in general, you want to make this calculation as simple as possible + # and return True if in doubt (you can always return num_children == 0 later) + return True + def get_child_index(self,name): # given a name, return its index # you can return None if you don't know the answer for a given name diff --git a/lldb/examples/synthetic/gnu_libstdcpp.py b/lldb/examples/synthetic/gnu_libstdcpp.py index c08a42c6063..0d124d75865 100644 --- a/lldb/examples/synthetic/gnu_libstdcpp.py +++ b/lldb/examples/synthetic/gnu_libstdcpp.py @@ -132,6 +132,27 @@ class StdListSynthProvider: except: pass + def has_children(self): + logger = lldb.formatters.Logger.Logger() + if self.count == None: + self.update () + try: + next_val = self.next.GetValueAsUnsigned(0) + prev_val = self.prev.GetValueAsUnsigned(0) + if next_val == 0 or prev_val == 0: + return False + if next_val == self.node_address: + return False + # skip all the advanced logic to detect the exact count of children + # in the interest of speed from this point on, we MIGHT have children + # our loop detection logic will still make nothing show up :) + return True + except: + return False + if self.count == 0: + return False + return True + class StdVectorSynthProvider: def __init__(self, valobj, dict): @@ -225,6 +246,10 @@ class StdVectorSynthProvider: self.count = 0 except: pass + + + def has_children(self): + return self.num_children() > 0 class StdMapSynthProvider: @@ -408,6 +433,8 @@ class StdMapSynthProvider: x = y; return x; + def has_children(self): + return self.num_children() > 0 _map_capping_size = 255 _list_capping_size = 255 diff --git a/lldb/examples/synthetic/libcxx.py b/lldb/examples/synthetic/libcxx.py index 967b7f4b32b..8c58ae52faa 100644 --- a/lldb/examples/synthetic/libcxx.py +++ b/lldb/examples/synthetic/libcxx.py @@ -124,6 +124,10 @@ class stdvector_SynthProvider: except: pass + def has_children(self): + # retrieving the count is quick enough on a std::vector + return self.num_children() > 0 + # Just an example: the actual summary is produced by a summary string: size=${svar%#} def stdvector_SummaryProvider(valobj,dict): prov = stdvector_SynthProvider(valobj,None) @@ -317,6 +321,28 @@ class stdlist_SynthProvider: except: pass + def has_children(self): + logger = lldb.formatters.Logger.Logger() + if self.count == None: + self.update() + try: + next_val = self.head.GetValueAsUnsigned(0) + prev_val = self.tail.GetValueAsUnsigned(0) + if next_val == 0 or prev_val == 0: + return False + if next_val == self.node_address: + return False + # skip all the advanced logic to detect the exact count of children + # in the interest of speed from this point on, we MIGHT have children + # our loop detection logic will still make nothing show up :) + return True + except: + return 0; + if self.count == 0: + return False + return True + + # Just an example: the actual summary is produced by a summary string: size=${svar%#} def stdlist_SummaryProvider(valobj,dict): prov = stdlist_SynthProvider(valobj,None) @@ -477,6 +503,9 @@ class stdmap_SynthProvider: except: return 0; + def has_children(self): + return self.num_children_impl() > 0 + def get_data_type(self): logger = lldb.formatters.Logger.Logger() if self.data_type == None or self.data_size == None: @@ -599,6 +628,11 @@ class stddeque_SynthProvider: return 0 return min(self.count, _deque_capping_size) + def has_children(self): + if self.cont is None: + self.update() + return self.count > 0 + def get_child_index(self,name): logger = lldb.formatters.Logger.Logger() try: @@ -702,6 +736,9 @@ class stdsharedptr_SynthProvider: def num_children(self): return 1 + def has_children(self): + return True + def get_child_index(self,name): if name=="__ptr_": return 0 diff --git a/lldb/source/Core/CXXFormatterFunctions.cpp b/lldb/source/Core/CXXFormatterFunctions.cpp index bc205b194a8..4ff90e91fe5 100644 --- a/lldb/source/Core/CXXFormatterFunctions.cpp +++ b/lldb/source/Core/CXXFormatterFunctions.cpp @@ -776,7 +776,9 @@ lldb_private::formatters::NSArrayMSyntheticFrontEnd::Update() bool lldb_private::formatters::NSArrayMSyntheticFrontEnd::MightHaveChildren () { - return CalculateNumChildren() > 0; + if (!m_data_32 && !m_data_64) + Update (); + return CalculateNumChildren(); } static uint32_t @@ -891,7 +893,9 @@ lldb_private::formatters::NSArrayISyntheticFrontEnd::Update() bool lldb_private::formatters::NSArrayISyntheticFrontEnd::MightHaveChildren () { - return CalculateNumChildren() > 0; + if (!m_data_ptr) + Update (); + return CalculateNumChildren(); } lldb::ValueObjectSP @@ -1186,7 +1190,9 @@ lldb_private::formatters::NSDictionaryISyntheticFrontEnd::Update() bool lldb_private::formatters::NSDictionaryISyntheticFrontEnd::MightHaveChildren () { - return CalculateNumChildren() > 0; + if (!m_data_32 && !m_data_64) + Update (); + return CalculateNumChildren(); } lldb::ValueObjectSP @@ -1333,7 +1339,9 @@ lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::Update() bool lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::MightHaveChildren () { - return CalculateNumChildren() > 0; + if (!m_data_32 && !m_data_64) + Update (); + return CalculateNumChildren(); } lldb::ValueObjectSP |