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:
Johnny Chen 2011-07-26 20:57:10 +00:00
parent 2aedba6c5e
commit e33b166da1
2 changed files with 42 additions and 22 deletions

View File

@ -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:

View File

@ -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.