summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/examples/synthetic/bitfield/example.py6
-rw-r--r--lldb/examples/synthetic/gnu_libstdcpp.py27
-rw-r--r--lldb/examples/synthetic/libcxx.py37
-rw-r--r--lldb/source/Core/CXXFormatterFunctions.cpp16
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
OpenPOWER on IntegriCloud