blob: 6e512998da2f3353d25ac563f5657d8a26cb8902 [file] [log] [blame]
Greg Clayton0a94b662012-01-30 19:32:25 +00001#!/usr/bin/python
2
3import lldb
4
Kate Stoneb9c1b512016-09-06 20:57:50 +00005
Greg Clayton0a94b662012-01-30 19:32:25 +00006class value(object):
7 '''A class that wraps an lldb.SBValue object and returns an object that
8 can be used as an object with attribytes:\n
9 argv = a.value(lldb.frame.FindVariable('argv'))\n
10 argv.name - return the name of the value that this object contains\n
11 argv.type - return the lldb.SBType for this value
12 argv.type_name - return the name of the type
13 argv.size - return the byte size of this value
14 argv.is_in_scope - return true if this value is currently in scope
15 argv.is_pointer - return true if this value is a pointer
16 argv.format - return the current format for this value
17 argv.value - return the value's value as a string
18 argv.summary - return a summary of this value's value
19 argv.description - return the runtime description for this value
20 argv.location - return a string that represents the values location (address, register, etc)
21 argv.target - return the lldb.SBTarget for this value
22 argv.process - return the lldb.SBProcess for this value
23 argv.thread - return the lldb.SBThread for this value
24 argv.frame - return the lldb.SBFrame for this value
25 argv.num_children - return the number of children this value has
26 argv.children - return a list of sbvalue objects that represents all of the children of this value
27 '''
Kate Stoneb9c1b512016-09-06 20:57:50 +000028
Greg Clayton0a94b662012-01-30 19:32:25 +000029 def __init__(self, sbvalue):
30 self.sbvalue = sbvalue
31
32 def __nonzero__(self):
33 return self.sbvalue.__nonzero__()
34
35 def __repr__(self):
36 return self.sbvalue.__repr__()
37
38 def __str__(self):
39 return self.sbvalue.__str__()
40
41 def __getitem__(self, key):
Kate Stoneb9c1b512016-09-06 20:57:50 +000042 if isinstance(key, int):
43 return value(
44 self.sbvalue.GetChildAtIndex(
45 key, lldb.eNoDynamicValues, True))
Greg Clayton0a94b662012-01-30 19:32:25 +000046 raise TypeError
Kate Stoneb9c1b512016-09-06 20:57:50 +000047
Greg Clayton0a94b662012-01-30 19:32:25 +000048 def __getattr__(self, name):
49 if name == 'name':
50 return self.sbvalue.GetName()
51 if name == 'type':
52 return self.sbvalue.GetType()
53 if name == 'type_name':
54 return self.sbvalue.GetTypeName()
55 if name == 'size':
56 return self.sbvalue.GetByteSize()
57 if name == 'is_in_scope':
58 return self.sbvalue.IsInScope()
59 if name == 'is_pointer':
60 return self.sbvalue.TypeIsPointerType()
61 if name == 'format':
Kate Stoneb9c1b512016-09-06 20:57:50 +000062 return self.sbvalue.GetFormat()
Greg Clayton0a94b662012-01-30 19:32:25 +000063 if name == 'value':
Kate Stoneb9c1b512016-09-06 20:57:50 +000064 return self.sbvalue.GetValue()
Greg Clayton0a94b662012-01-30 19:32:25 +000065 if name == 'summary':
Kate Stoneb9c1b512016-09-06 20:57:50 +000066 return self.sbvalue.GetSummary()
Greg Clayton0a94b662012-01-30 19:32:25 +000067 if name == 'description':
Kate Stoneb9c1b512016-09-06 20:57:50 +000068 return self.sbvalue.GetObjectDescription()
Greg Clayton0a94b662012-01-30 19:32:25 +000069 if name == 'location':
Kate Stoneb9c1b512016-09-06 20:57:50 +000070 return self.sbvalue.GetLocation()
Greg Clayton0a94b662012-01-30 19:32:25 +000071 if name == 'target':
72 return self.sbvalue.GetTarget()
73 if name == 'process':
74 return self.sbvalue.GetProcess()
75 if name == 'thread':
76 return self.sbvalue.GetThread()
77 if name == 'frame':
78 return self.sbvalue.GetFrame()
79 if name == 'num_children':
80 return self.sbvalue.GetNumChildren()
81 if name == 'children':
Kate Stoneb9c1b512016-09-06 20:57:50 +000082 # Returns an array of sbvalue objects, one for each child of
Greg Clayton0a94b662012-01-30 19:32:25 +000083 # the value for the lldb.SBValue
84 children = []
Kate Stoneb9c1b512016-09-06 20:57:50 +000085 for i in range(self.sbvalue.GetNumChildren()):
86 children.append(
87 value(
88 self.sbvalue.GetChildAtIndex(
89 i,
90 lldb.eNoDynamicValues,
91 True)))
Greg Clayton0a94b662012-01-30 19:32:25 +000092 return children
93 raise AttributeError
Kate Stoneb9c1b512016-09-06 20:57:50 +000094
95
Greg Clayton0a94b662012-01-30 19:32:25 +000096class variable(object):
97 '''A class that treats a lldb.SBValue and allows it to be used just as
Kate Stoneb9c1b512016-09-06 20:57:50 +000098 a variable would be in code. So if you have a Point structure variable
Greg Clayton0a94b662012-01-30 19:32:25 +000099 in your code, you would be able to do: "pt.x + pt.y"'''
Kate Stoneb9c1b512016-09-06 20:57:50 +0000100
Greg Clayton0a94b662012-01-30 19:32:25 +0000101 def __init__(self, sbvalue):
102 self.sbvalue = sbvalue
103
104 def __nonzero__(self):
105 return self.sbvalue.__nonzero__()
106
107 def __repr__(self):
108 return self.sbvalue.__repr__()
109
110 def __str__(self):
111 return self.sbvalue.__str__()
112
113 def __getitem__(self, key):
114 # Allow array access if this value has children...
Kate Stoneb9c1b512016-09-06 20:57:50 +0000115 if isinstance(key, int):
116 return variable(
117 self.sbvalue.GetValueForExpressionPath(
118 "[%i]" %
119 key))
Greg Clayton0a94b662012-01-30 19:32:25 +0000120 raise TypeError
121
122 def __getattr__(self, name):
Kate Stoneb9c1b512016-09-06 20:57:50 +0000123 child_sbvalue = self.sbvalue.GetChildMemberWithName(name)
Greg Clayton0a94b662012-01-30 19:32:25 +0000124 if child_sbvalue:
125 return variable(child_sbvalue)
126 raise AttributeError
127
128 def __add__(self, other):
129 return int(self) + int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000130
Greg Clayton0a94b662012-01-30 19:32:25 +0000131 def __sub__(self, other):
132 return int(self) - int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000133
Greg Clayton0a94b662012-01-30 19:32:25 +0000134 def __mul__(self, other):
135 return int(self) * int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000136
Greg Clayton0a94b662012-01-30 19:32:25 +0000137 def __floordiv__(self, other):
138 return int(self) // int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000139
Greg Clayton0a94b662012-01-30 19:32:25 +0000140 def __mod__(self, other):
141 return int(self) % int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142
Greg Clayton0a94b662012-01-30 19:32:25 +0000143 def __divmod__(self, other):
144 return int(self) % int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000145
Greg Clayton0a94b662012-01-30 19:32:25 +0000146 def __pow__(self, other):
147 return int(self) ** int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000148
Greg Clayton0a94b662012-01-30 19:32:25 +0000149 def __lshift__(self, other):
150 return int(self) << int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151
Greg Clayton0a94b662012-01-30 19:32:25 +0000152 def __rshift__(self, other):
153 return int(self) >> int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000154
Greg Clayton0a94b662012-01-30 19:32:25 +0000155 def __and__(self, other):
156 return int(self) & int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000157
Greg Clayton0a94b662012-01-30 19:32:25 +0000158 def __xor__(self, other):
159 return int(self) ^ int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000160
Greg Clayton0a94b662012-01-30 19:32:25 +0000161 def __or__(self, other):
162 return int(self) | int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000163
Greg Clayton0a94b662012-01-30 19:32:25 +0000164 def __div__(self, other):
165 return int(self) / int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000166
Greg Clayton0a94b662012-01-30 19:32:25 +0000167 def __truediv__(self, other):
168 return int(self) / int(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000169
Greg Clayton0a94b662012-01-30 19:32:25 +0000170 def __iadd__(self, other):
171 result = self.__add__(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000172 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000173 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000174
Greg Clayton0a94b662012-01-30 19:32:25 +0000175 def __isub__(self, other):
176 result = self.__sub__(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000177 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000178 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000179
Greg Clayton0a94b662012-01-30 19:32:25 +0000180 def __imul__(self, other):
181 result = self.__mul__(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000182 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000183 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000184
Greg Clayton0a94b662012-01-30 19:32:25 +0000185 def __idiv__(self, other):
186 result = self.__div__(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000187 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000188 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000189
Greg Clayton0a94b662012-01-30 19:32:25 +0000190 def __itruediv__(self, other):
191 result = self.__truediv__(other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000192 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000193 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000194
Greg Clayton0a94b662012-01-30 19:32:25 +0000195 def __ifloordiv__(self, other):
Kate Stoneb9c1b512016-09-06 20:57:50 +0000196 result = self.__floordiv__(self, other)
197 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000198 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000199
Greg Clayton0a94b662012-01-30 19:32:25 +0000200 def __imod__(self, other):
Kate Stoneb9c1b512016-09-06 20:57:50 +0000201 result = self.__and__(self, other)
202 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000203 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000204
Greg Clayton0a94b662012-01-30 19:32:25 +0000205 def __ipow__(self, other):
206 result = self.__pow__(self, other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000207 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000208 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000209
Greg Clayton0a94b662012-01-30 19:32:25 +0000210 def __ipow__(self, other, modulo):
211 result = self.__pow__(self, other, modulo)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000212 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000213 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000214
Greg Clayton0a94b662012-01-30 19:32:25 +0000215 def __ilshift__(self, other):
216 result = self.__lshift__(self, other)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000217 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000218 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000219
Greg Clayton0a94b662012-01-30 19:32:25 +0000220 def __irshift__(self, other):
Kate Stoneb9c1b512016-09-06 20:57:50 +0000221 result = self.__rshift__(self, other)
222 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000223 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000224
Greg Clayton0a94b662012-01-30 19:32:25 +0000225 def __iand__(self, other):
Kate Stoneb9c1b512016-09-06 20:57:50 +0000226 result = self.__and__(self, other)
227 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000228 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000229
Greg Clayton0a94b662012-01-30 19:32:25 +0000230 def __ixor__(self, other):
Kate Stoneb9c1b512016-09-06 20:57:50 +0000231 result = self.__xor__(self, other)
232 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000233 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000234
Greg Clayton0a94b662012-01-30 19:32:25 +0000235 def __ior__(self, other):
Kate Stoneb9c1b512016-09-06 20:57:50 +0000236 result = self.__ior__(self, other)
237 self.sbvalue.SetValueFromCString(str(result))
Greg Clayton0a94b662012-01-30 19:32:25 +0000238 return result
Kate Stoneb9c1b512016-09-06 20:57:50 +0000239
Greg Clayton0a94b662012-01-30 19:32:25 +0000240 def __neg__(self):
241 return -int(self)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000242
Greg Clayton0a94b662012-01-30 19:32:25 +0000243 def __pos__(self):
244 return +int(self)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000245
Greg Clayton0a94b662012-01-30 19:32:25 +0000246 def __abs__(self):
247 return abs(int(self))
Kate Stoneb9c1b512016-09-06 20:57:50 +0000248
Greg Clayton0a94b662012-01-30 19:32:25 +0000249 def __invert__(self):
250 return ~int(self)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000251
Greg Clayton0a94b662012-01-30 19:32:25 +0000252 def __complex__(self):
Kate Stoneb9c1b512016-09-06 20:57:50 +0000253 return complex(int(self))
254
Greg Clayton0a94b662012-01-30 19:32:25 +0000255 def __int__(self):
256 return self.sbvalue.GetValueAsSigned()
Kate Stoneb9c1b512016-09-06 20:57:50 +0000257
Greg Clayton0a94b662012-01-30 19:32:25 +0000258 def __long__(self):
259 return self.sbvalue.GetValueAsSigned()
Kate Stoneb9c1b512016-09-06 20:57:50 +0000260
Greg Clayton0a94b662012-01-30 19:32:25 +0000261 def __float__(self):
Kate Stoneb9c1b512016-09-06 20:57:50 +0000262 return float(self.sbvalue.GetValueAsSigned())
263
Greg Clayton0a94b662012-01-30 19:32:25 +0000264 def __oct__(self):
265 return '0%o' % self.sbvalue.GetValueAsSigned()
Kate Stoneb9c1b512016-09-06 20:57:50 +0000266
Greg Clayton0a94b662012-01-30 19:32:25 +0000267 def __hex__(self):
268 return '0x%x' % self.sbvalue.GetValueAsSigned()