diff options
Diffstat (limited to 'lldb/test/functionalities/data-formatter/data-formatter-python-synth')
4 files changed, 88 insertions, 86 deletions
diff --git a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdListSynthProvider.py b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdListSynthProvider.py index 1cfe8c24147..a464c80a91e 100644 --- a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdListSynthProvider.py +++ b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdListSynthProvider.py @@ -23,21 +23,17 @@ class StdListSynthProvider: return (size - 1) def get_child_index(self,name): - if name == "len": - return self.num_children() - else: - return int(name.lstrip('[').rstrip(']')) + return int(name.lstrip('[').rstrip(']')) def get_child_at_index(self,index): - if index == self.num_children(): - return self.valobj.CreateValueFromExpression("len",str(self.num_children())) - else: - offset = index - current = self.next - while offset > 0: - current = current.GetChildMemberWithName('_M_next') - offset = offset - 1 - return current.CreateChildAtOffset('['+str(index)+']',2*current.GetType().GetByteSize(),self.data_type) + if index >= self.num_children(): + return None; + offset = index + current = self.next + while offset > 0: + current = current.GetChildMemberWithName('_M_next') + offset = offset - 1 + return current.CreateChildAtOffset('['+str(index)+']',2*current.GetType().GetByteSize(),self.data_type) def extract_type_name(self,name): self.type_name = name[16:] diff --git a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdMapSynthProvider.py b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdMapSynthProvider.py index bb109331e22..71357856bc6 100644 --- a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdMapSynthProvider.py +++ b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdMapSynthProvider.py @@ -1,8 +1,11 @@ import re + class StdMapSynthProvider: + def __init__(self, valobj, dict): self.valobj = valobj; self.update() + def update(self): self.Mt = self.valobj.GetChildMemberWithName('_M_t') self.Mimpl = self.Mt.GetChildMemberWithName('_M_impl') @@ -19,6 +22,7 @@ class StdMapSynthProvider: self.data_type = self.Mt.GetTarget().FindFirstType(self.gcc_type_name) self.data_size = self.data_type.GetByteSize() self.skip_size = self.Mheader.GetType().GetByteSize() + def expand_clang_type_name(self): type_name = self.Mimpl.GetType().GetName() index = type_name.find("std::pair<") @@ -35,6 +39,7 @@ class StdMapSynthProvider: template_count = template_count - 1 index = index + 1; self.clang_type_name = type_name + def expand_gcc_type_name(self): type_name = self.Mt.GetType().GetName() index = type_name.find("std::pair<") @@ -54,36 +59,40 @@ class StdMapSynthProvider: index = index - 1 index = index + 1; self.gcc_type_name = type_name + def num_children(self): root_ptr_val = self.node_ptr_value(self.Mroot) if root_ptr_val == 0: return 0; return self.Mimpl.GetChildMemberWithName('_M_node_count').GetValueAsUnsigned(0) + def get_child_index(self,name): - if name == "len": - return self.num_children(); - else: - return int(name.lstrip('[').rstrip(']')) + return int(name.lstrip('[').rstrip(']')) + def get_child_at_index(self,index): - if index == self.num_children(): - return self.valobj.CreateValueFromExpression("len",str(self.num_children())) - else: - offset = index - current = self.left(self.Mheader); - while offset > 0: - current = self.increment_node(current) - offset = offset - 1; - # skip all the base stuff and get at the data - return current.CreateChildAtOffset('['+str(index)+']',self.skip_size,self.data_type) + if index >= self.num_children(): + return None; + offset = index + current = self.left(self.Mheader); + while offset > 0: + current = self.increment_node(current) + offset = offset - 1; + # skip all the base stuff and get at the data + return current.CreateChildAtOffset('['+str(index)+']',self.skip_size,self.data_type) + # utility functions def node_ptr_value(self,node): return node.GetValueAsUnsigned(0) + def right(self,node): return node.GetChildMemberWithName("_M_right"); + def left(self,node): return node.GetChildMemberWithName("_M_left"); + def parent(self,node): return node.GetChildMemberWithName("_M_parent"); + # from libstdc++ implementation of iterator for rbtree def increment_node(self,node): if self.node_ptr_value(self.right(node)) != 0: diff --git a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdVectorSynthProvider.py b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdVectorSynthProvider.py index dc226902d1e..f2b3d442925 100644 --- a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdVectorSynthProvider.py +++ b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdVectorSynthProvider.py @@ -1,55 +1,52 @@ class StdVectorSynthProvider: - def __init__(self, valobj, dict): - self.valobj = valobj; - self.update() + def __init__(self, valobj, dict): + self.valobj = valobj; + self.update() - def num_children(self): - start_val = self.start.GetValueAsUnsigned(0) - finish_val = self.finish.GetValueAsUnsigned(0) - end_val = self.end.GetValueAsUnsigned(0) - # Before a vector has been constructed, it will contain bad values - # so we really need to be careful about the length we return since - # unitialized data can cause us to return a huge number. We need - # to also check for any of the start, finish or end of storage values - # being zero (NULL). If any are, then this vector has not been - # initialized yet and we should return zero + def num_children(self): + start_val = self.start.GetValueAsUnsigned(0) + finish_val = self.finish.GetValueAsUnsigned(0) + end_val = self.end.GetValueAsUnsigned(0) + # Before a vector has been constructed, it will contain bad values + # so we really need to be careful about the length we return since + # unitialized data can cause us to return a huge number. We need + # to also check for any of the start, finish or end of storage values + # being zero (NULL). If any are, then this vector has not been + # initialized yet and we should return zero - # Make sure nothing is NULL - if start_val == 0 or finish_val == 0 or end_val == 0: - return 0 - # Make sure start is less than finish - if start_val >= finish_val: - return 0 - # Make sure finish is less than or equal to end of storage - if finish_val > end_val: - return 0 + # Make sure nothing is NULL + if start_val == 0 or finish_val == 0 or end_val == 0: + return 0 + # Make sure start is less than finish + if start_val >= finish_val: + return 0 + # Make sure finish is less than or equal to end of storage + if finish_val > end_val: + return 0 - # We might still get things wrong, so cap things at 256 items for now - # TODO: read a target "settings set" variable for this to allow it to - # be customized - num_children = (finish_val-start_val)/self.data_size - if num_children > 256: - return 256 - return num_children + # We might still get things wrong, so cap things at 256 items for now + # TODO: read a target "settings set" variable for this to allow it to + # be customized + num_children = (finish_val-start_val)/self.data_size + if num_children > 256: + return 256 + return num_children - def get_child_index(self,name): - if name == "len": - return self.num_children(); - else: - return int(name.lstrip('[').rstrip(']')) + def get_child_index(self,name): + return int(name.lstrip('[').rstrip(']')) - def get_child_at_index(self,index): - if index == self.num_children(): - return self.valobj.CreateValueFromExpression("len",str(self.num_children())) - else: - offset = index * self.data_size - return self.start.CreateChildAtOffset('['+str(index)+']',offset,self.data_type) + def get_child_at_index(self,index): + if index >= self.num_children(): + return None; + offset = index * self.data_size + return self.start.CreateChildAtOffset('['+str(index)+']',offset,self.data_type) + + def update(self): + impl = self.valobj.GetChildMemberWithName('_M_impl') + self.start = impl.GetChildMemberWithName('_M_start') + self.finish = impl.GetChildMemberWithName('_M_finish') + self.end = impl.GetChildMemberWithName('_M_end_of_storage') + self.data_type = self.start.GetType().GetPointeeType() + self.data_size = self.data_type.GetByteSize() - def update(self): - impl = self.valobj.GetChildMemberWithName('_M_impl') - self.start = impl.GetChildMemberWithName('_M_start') - self.finish = impl.GetChildMemberWithName('_M_finish') - self.end = impl.GetChildMemberWithName('_M_end_of_storage') - self.data_type = self.start.GetType().GetPointeeType() - self.data_size = self.data_type.GetByteSize() diff --git a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py index 14859e0caef..1161f75e0ce 100644 --- a/lldb/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py +++ b/lldb/test/functionalities/data-formatter/data-formatter-python-synth/TestDataFormatterPythonSynth.py @@ -191,7 +191,7 @@ class DataFormatterTestCase(TestBase): 'smart']) # test summaries based on synthetic children - self.runCmd("type summary add std::string_vect string_vect -f \"vector has ${svar.len} items\" -e") + self.runCmd("type summary add std::string_vect string_vect -f \"vector has ${svar%#} items\" -e") self.expect("frame variable strings", substrs = ['vector has 3 items', 'goofy', @@ -215,24 +215,24 @@ class DataFormatterTestCase(TestBase): self.runCmd("frame variable numbers_list -T") self.runCmd("type synth add std::int_list std::string_list int_list string_list -l StdListSynthProvider") - self.runCmd("type summary add std::int_list std::string_list int_list string_list -f \"list has ${svar.len} items\" -e") + self.runCmd("type summary add std::int_list std::string_list int_list string_list -f \"list has ${svar%#} items\" -e") self.runCmd("type format add -f hex int") self.expect("frame variable numbers_list", - substrs = ['list has 0x00000000 items', + substrs = ['list has 0 items', '{}']) self.runCmd("n") self.expect("frame variable numbers_list", - substrs = ['list has 0x00000001 items', + substrs = ['list has 1 items', '[0] = ', '0x12345678']) self.runCmd("n");self.runCmd("n");self.runCmd("n"); self.expect("frame variable numbers_list", - substrs = ['list has 0x00000004 items', + substrs = ['list has 4 items', '[0] = ', '0x12345678', '[1] =', @@ -245,7 +245,7 @@ class DataFormatterTestCase(TestBase): self.runCmd("n");self.runCmd("n"); self.expect("frame variable numbers_list", - substrs = ['list has 0x00000006 items', + substrs = ['list has 6 items', '[0] = ', '0x12345678', '0x11223344', @@ -259,14 +259,14 @@ class DataFormatterTestCase(TestBase): self.runCmd("n") self.expect("frame variable numbers_list", - substrs = ['list has 0x00000000 items', + substrs = ['list has 0 items', '{}']) self.runCmd("n");self.runCmd("n");self.runCmd("n");self.runCmd("n"); self.expect("frame variable numbers_list", - substrs = ['list has 0x00000004 items', + substrs = ['list has 4 items', '[0] = ', '1', '[1] = ', '2', '[2] = ', '3', @@ -305,7 +305,7 @@ class DataFormatterTestCase(TestBase): self.runCmd("frame variable ii -T") self.runCmd("script from StdMapSynthProvider import *") - self.runCmd("type summary add std::intint_map intint_map -f \"map has ${svar.len} items\" -e") + self.runCmd("type summary add std::intint_map intint_map -f \"map has ${svar%#} items\" -e") self.runCmd("type synth add std::intint_map intint_map -l StdMapSynthProvider") @@ -356,7 +356,7 @@ class DataFormatterTestCase(TestBase): self.runCmd("n") self.runCmd("frame variable si -T") - self.runCmd("type summary add std::strint_map strint_map -f \"map has ${svar.len} items\" -e") + self.runCmd("type summary add std::strint_map strint_map -f \"map has ${svar%#} items\" -e") self.runCmd("type synth add std::strint_map strint_map -l StdMapSynthProvider") self.expect('frame variable si', @@ -400,7 +400,7 @@ class DataFormatterTestCase(TestBase): self.runCmd("n") self.runCmd("frame variable is -T") - self.runCmd("type summary add std::intstr_map intstr_map -f \"map has ${svar.len} items\" -e") + self.runCmd("type summary add std::intstr_map intstr_map -f \"map has ${svar%#} items\" -e") self.runCmd("type synth add std::intstr_map intstr_map -l StdMapSynthProvider") self.expect('frame variable is', @@ -433,7 +433,7 @@ class DataFormatterTestCase(TestBase): self.runCmd("n") self.runCmd("frame variable ss -T") - self.runCmd("type summary add std::strstr_map strstr_map -f \"map has ${svar.len} items\" -e") + self.runCmd("type summary add std::strstr_map strstr_map -f \"map has ${svar%#} items\" -e") self.runCmd("type synth add std::strstr_map strstr_map -l StdMapSynthProvider") self.expect('frame variable ss', |