forked from OSchip/llvm-project
We can do better with the SBValue.linked_list_iter() API by supplying a default
end of list test function as __eol_test__. The simple example can be reduced to: for t in task_head.linked_list_iter('next'): print t Modify the test program to exercise the API for both cases: supplying or not supplying an end of list test function. llvm-svn: 136144
This commit is contained in:
parent
2aedba6c5e
commit
e33b166da1
|
@ -89,10 +89,21 @@ def lldb_iter(obj, getsize, getelem):
|
|||
# which takes an SBValue and returns True if EOL is reached and False if not.
|
||||
#
|
||||
linked_list_iter_def = '''
|
||||
def __eol_test__(val):
|
||||
"""Default function for end of list test takes an SBValue object.
|
||||
|
||||
Return True if val is invalid or it corresponds to a null pointer.
|
||||
Otherwise, return False.
|
||||
"""
|
||||
if not val or int(val.GetValue(), 0) == 0:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
# ==================================================
|
||||
# Iterator for lldb.SBValue treated as a linked list
|
||||
# ==================================================
|
||||
def linked_list_iter(self, next_item_name, end_of_list_test):
|
||||
def linked_list_iter(self, next_item_name, end_of_list_test=__eol_test__):
|
||||
"""Generator adaptor to support iteration for SBValue as a linked list.
|
||||
|
||||
linked_list_iter() is a special purpose iterator to treat the SBValue as
|
||||
|
@ -101,18 +112,11 @@ linked_list_iter_def = '''
|
|||
end-of-list test function which takes an SBValue for an item and returns
|
||||
True if EOL is reached and False if not.
|
||||
|
||||
The end_of_list_test arg, if omitted, defaults to the __eol_test__
|
||||
function above.
|
||||
|
||||
For example,
|
||||
|
||||
def eol(val):
|
||||
\'\'\'Test function to determine end of list.\'\'\'
|
||||
# End of list is reached if either the value object is invalid
|
||||
# or it corresponds to a null pointer.
|
||||
if not val or int(val.GetValue(), 16) == 0:
|
||||
return True
|
||||
|
||||
# Otherwise, return False.
|
||||
return False
|
||||
|
||||
# Get Frame #0.
|
||||
...
|
||||
|
||||
|
@ -120,7 +124,7 @@ linked_list_iter_def = '''
|
|||
task_head = frame0.FindVariable('task_head')
|
||||
...
|
||||
|
||||
for t in task_head.linked_list_iter('next', eol):
|
||||
for t in task_head.linked_list_iter('next'):
|
||||
print t
|
||||
"""
|
||||
try:
|
||||
|
|
|
@ -54,16 +54,6 @@ class ValueAsLinkedListTestCase(TestBase):
|
|||
process = target.LaunchSimple(None, None, os.getcwd())
|
||||
self.assertTrue(process, PROCESS_IS_VALID)
|
||||
|
||||
def eol(val):
|
||||
"""Test function to determine end of list."""
|
||||
# End of list is reached if either the value object is invalid
|
||||
# or it corresponds to a null pointer.
|
||||
if not val or int(val.GetValue(), 16) == 0:
|
||||
return True
|
||||
|
||||
# Otherwise, return False.
|
||||
return False
|
||||
|
||||
# Get Frame #0.
|
||||
self.assertTrue(process.GetState() == lldb.eStateStopped)
|
||||
thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
|
||||
|
@ -80,6 +70,32 @@ class ValueAsLinkedListTestCase(TestBase):
|
|||
list = []
|
||||
|
||||
cvf = lldbutil.ChildVisitingFormatter(indent_child=2)
|
||||
for t in task_head.linked_list_iter('next'):
|
||||
self.assertTrue(t, VALID_VARIABLE)
|
||||
# Make sure that 'next' corresponds to an SBValue with pointer type.
|
||||
self.assertTrue(t.TypeIsPointerType())
|
||||
if self.TraceOn():
|
||||
print cvf.format(t)
|
||||
list.append(int(t.GetChildMemberWithName("id").GetValue()))
|
||||
|
||||
# Sanity checks that the we visited all the items (no more, no less).
|
||||
if self.TraceOn():
|
||||
print "visited IDs:", list
|
||||
self.assertTrue(visitedIDs == list)
|
||||
|
||||
# Let's exercise the linked_list_iter() API again, this time supplying
|
||||
# our end of list test function.
|
||||
def eol(val):
|
||||
"""Test function to determine end of list."""
|
||||
# End of list is reached if either the value object is invalid
|
||||
# or it corresponds to a null pointer.
|
||||
if not val or int(val.GetValue(), 16) == 0:
|
||||
return True
|
||||
|
||||
# Otherwise, return False.
|
||||
return False
|
||||
|
||||
list = []
|
||||
for t in task_head.linked_list_iter('next', eol):
|
||||
self.assertTrue(t, VALID_VARIABLE)
|
||||
# Make sure that 'next' corresponds to an SBValue with pointer type.
|
||||
|
|
Loading…
Reference in New Issue