diff options
author | Greg Clayton <gclayton@apple.com> | 2011-07-30 22:25:25 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2011-07-30 22:25:25 +0000 |
commit | 3883bca4f4e3659049ad6f15a495951fa827f5a7 (patch) | |
tree | d4c7e0312a8613f85a966fa81c62359c30611553 /lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdVectorSynthProvider.py | |
parent | 8fd6dc0df3715938e67973c8a9e7e2636c0d42e6 (diff) | |
download | bcm5719-llvm-3883bca4f4e3659049ad6f15a495951fa827f5a7.tar.gz bcm5719-llvm-3883bca4f4e3659049ad6f15a495951fa827f5a7.zip |
Protect a bit better against uninitialized vectors.
llvm-svn: 136578
Diffstat (limited to 'lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdVectorSynthProvider.py')
-rw-r--r-- | lldb/test/functionalities/data-formatter/data-formatter-python-synth/StdVectorSynthProvider.py | 46 |
1 files changed, 38 insertions, 8 deletions
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 91e634a718a..ff0672b3928 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,25 +1,55 @@ class StdVectorSynthProvider: + def __init__(self, valobj, dict): self.valobj = valobj; self.update() + def num_children(self): - start_val = int(self.Mstart.GetValue(),0) - finish_val = int(self.Mfinish.GetValue(),0) - return (finish_val-start_val)/self.data_size + start_val = int(self.start.GetValue(),0) + finish_val = int(self.finish.GetValue(),0) + end_val = int(self.end.GetValue(),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 + + # 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_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.Mstart.CreateChildAtOffset('['+str(index)+']',offset,self.data_type) + return self.start.CreateChildAtOffset('['+str(index)+']',offset,self.data_type) + def update(self): - self.Mimpl = self.valobj.GetChildMemberWithName('_M_impl') - self.Mstart = self.Mimpl.GetChildMemberWithName('_M_start') - self.Mfinish = self.Mimpl.GetChildMemberWithName('_M_finish') - self.data_type = self.Mstart.GetType().GetPointeeType() + 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() |