xref: /freebsd/contrib/llvm-project/lldb/bindings/python/python-extensions.swig (revision 130d950cafcd29c6a32cf5357bf600dcd9c1d998)
1*130d950cSDimitry Andric%extend lldb::SBBreakpoint {
2*130d950cSDimitry Andric    %pythoncode %{
3*130d950cSDimitry Andric        def __eq__(self, rhs):
4*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
5*130d950cSDimitry Andric                return False
6*130d950cSDimitry Andric
7*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
8*130d950cSDimitry Andric
9*130d950cSDimitry Andric        def __ne__(self, rhs):
10*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
11*130d950cSDimitry Andric                return True
12*130d950cSDimitry Andric
13*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
14*130d950cSDimitry Andric    %}
15*130d950cSDimitry Andric}
16*130d950cSDimitry Andric
17*130d950cSDimitry Andric%extend lldb::SBBroadcaster {
18*130d950cSDimitry Andric    %pythoncode %{
19*130d950cSDimitry Andric        def __eq__(self, rhs):
20*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
21*130d950cSDimitry Andric                return False
22*130d950cSDimitry Andric
23*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
24*130d950cSDimitry Andric
25*130d950cSDimitry Andric        def __ne__(self, rhs):
26*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
27*130d950cSDimitry Andric                return True
28*130d950cSDimitry Andric
29*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
30*130d950cSDimitry Andric    %}
31*130d950cSDimitry Andric}
32*130d950cSDimitry Andric
33*130d950cSDimitry Andric%extend lldb::SBCommandReturnObject {
34*130d950cSDimitry Andric        /* the write() and flush() calls are not part of the SB API proper, and are solely for Python usage
35*130d950cSDimitry Andric        they are meant to make an SBCommandReturnObject into a file-like object so that instructions of the sort
36*130d950cSDimitry Andric        print >>sb_command_return_object, "something"
37*130d950cSDimitry Andric        will work correctly */
38*130d950cSDimitry Andric
39*130d950cSDimitry Andric        void lldb::SBCommandReturnObject::write (const char* str)
40*130d950cSDimitry Andric        {
41*130d950cSDimitry Andric            if (str)
42*130d950cSDimitry Andric                $self->Printf("%s",str);
43*130d950cSDimitry Andric        }
44*130d950cSDimitry Andric        void lldb::SBCommandReturnObject::flush ()
45*130d950cSDimitry Andric        {}
46*130d950cSDimitry Andric}
47*130d950cSDimitry Andric
48*130d950cSDimitry Andric%extend lldb::SBCompileUnit {
49*130d950cSDimitry Andric    %pythoncode %{
50*130d950cSDimitry Andric        def __eq__(self, rhs):
51*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
52*130d950cSDimitry Andric                return False
53*130d950cSDimitry Andric
54*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
55*130d950cSDimitry Andric
56*130d950cSDimitry Andric        def __ne__(self, rhs):
57*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
58*130d950cSDimitry Andric                return True
59*130d950cSDimitry Andric
60*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
61*130d950cSDimitry Andric    %}
62*130d950cSDimitry Andric}
63*130d950cSDimitry Andric
64*130d950cSDimitry Andric%extend lldb::SBDeclaration {
65*130d950cSDimitry Andric    %pythoncode %{
66*130d950cSDimitry Andric        def __eq__(self, rhs):
67*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
68*130d950cSDimitry Andric                return False
69*130d950cSDimitry Andric
70*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
71*130d950cSDimitry Andric
72*130d950cSDimitry Andric        def __ne__(self, rhs):
73*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
74*130d950cSDimitry Andric                return True
75*130d950cSDimitry Andric
76*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
77*130d950cSDimitry Andric    %}
78*130d950cSDimitry Andric}
79*130d950cSDimitry Andric
80*130d950cSDimitry Andric%extend lldb::SBFunction {
81*130d950cSDimitry Andric    %pythoncode %{
82*130d950cSDimitry Andric        def __eq__(self, rhs):
83*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
84*130d950cSDimitry Andric                return False
85*130d950cSDimitry Andric
86*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
87*130d950cSDimitry Andric
88*130d950cSDimitry Andric        def __ne__(self, rhs):
89*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
90*130d950cSDimitry Andric                return True
91*130d950cSDimitry Andric
92*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
93*130d950cSDimitry Andric    %}
94*130d950cSDimitry Andric}
95*130d950cSDimitry Andric
96*130d950cSDimitry Andric%extend lldb::SBLineEntry {
97*130d950cSDimitry Andric    %pythoncode %{
98*130d950cSDimitry Andric        def __eq__(self, rhs):
99*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
100*130d950cSDimitry Andric                return False
101*130d950cSDimitry Andric
102*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
103*130d950cSDimitry Andric
104*130d950cSDimitry Andric        def __ne__(self, rhs):
105*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
106*130d950cSDimitry Andric                return True
107*130d950cSDimitry Andric
108*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
109*130d950cSDimitry Andric    %}
110*130d950cSDimitry Andric}
111*130d950cSDimitry Andric
112*130d950cSDimitry Andric%extend lldb::SBModule {
113*130d950cSDimitry Andric    %pythoncode %{
114*130d950cSDimitry Andric        def __eq__(self, rhs):
115*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
116*130d950cSDimitry Andric                return False
117*130d950cSDimitry Andric
118*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
119*130d950cSDimitry Andric
120*130d950cSDimitry Andric        def __ne__(self, rhs):
121*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
122*130d950cSDimitry Andric                return True
123*130d950cSDimitry Andric
124*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
125*130d950cSDimitry Andric    %}
126*130d950cSDimitry Andric}
127*130d950cSDimitry Andric
128*130d950cSDimitry Andric%extend lldb::SBSection {
129*130d950cSDimitry Andric    %pythoncode %{
130*130d950cSDimitry Andric        def __eq__(self, rhs):
131*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
132*130d950cSDimitry Andric                return False
133*130d950cSDimitry Andric
134*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
135*130d950cSDimitry Andric
136*130d950cSDimitry Andric        def __ne__(self, rhs):
137*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
138*130d950cSDimitry Andric                return True
139*130d950cSDimitry Andric
140*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
141*130d950cSDimitry Andric    %}
142*130d950cSDimitry Andric}
143*130d950cSDimitry Andric%extend lldb::SBStream {
144*130d950cSDimitry Andric        /* the write() and flush() calls are not part of the SB API proper, and are solely for Python usage
145*130d950cSDimitry Andric        they are meant to make an SBStream into a file-like object so that instructions of the sort
146*130d950cSDimitry Andric        print >>sb_stream, "something"
147*130d950cSDimitry Andric        will work correctly */
148*130d950cSDimitry Andric
149*130d950cSDimitry Andric        void lldb::SBStream::write (const char* str)
150*130d950cSDimitry Andric        {
151*130d950cSDimitry Andric            if (str)
152*130d950cSDimitry Andric                $self->Printf("%s",str);
153*130d950cSDimitry Andric        }
154*130d950cSDimitry Andric        void lldb::SBStream::flush ()
155*130d950cSDimitry Andric        {}
156*130d950cSDimitry Andric}
157*130d950cSDimitry Andric%extend lldb::SBSymbol {
158*130d950cSDimitry Andric    %pythoncode %{
159*130d950cSDimitry Andric        def __eq__(self, rhs):
160*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
161*130d950cSDimitry Andric                return False
162*130d950cSDimitry Andric
163*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
164*130d950cSDimitry Andric
165*130d950cSDimitry Andric        def __ne__(self, rhs):
166*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
167*130d950cSDimitry Andric                return True
168*130d950cSDimitry Andric
169*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
170*130d950cSDimitry Andric    %}
171*130d950cSDimitry Andric}
172*130d950cSDimitry Andric
173*130d950cSDimitry Andric%extend lldb::SBTarget {
174*130d950cSDimitry Andric    %pythoncode %{
175*130d950cSDimitry Andric        def __eq__(self, rhs):
176*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
177*130d950cSDimitry Andric                return False
178*130d950cSDimitry Andric
179*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
180*130d950cSDimitry Andric
181*130d950cSDimitry Andric        def __ne__(self, rhs):
182*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
183*130d950cSDimitry Andric                return True
184*130d950cSDimitry Andric
185*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
186*130d950cSDimitry Andric    %}
187*130d950cSDimitry Andric}
188*130d950cSDimitry Andric
189*130d950cSDimitry Andric%extend lldb::SBTypeFilter {
190*130d950cSDimitry Andric    %pythoncode %{
191*130d950cSDimitry Andric        def __eq__(self, rhs):
192*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
193*130d950cSDimitry Andric                return False
194*130d950cSDimitry Andric
195*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
196*130d950cSDimitry Andric
197*130d950cSDimitry Andric        def __ne__(self, rhs):
198*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
199*130d950cSDimitry Andric                return True
200*130d950cSDimitry Andric
201*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
202*130d950cSDimitry Andric    %}
203*130d950cSDimitry Andric}
204*130d950cSDimitry Andric
205*130d950cSDimitry Andric%extend lldb::SBTypeNameSpecifier {
206*130d950cSDimitry Andric    %pythoncode %{
207*130d950cSDimitry Andric        def __eq__(self, rhs):
208*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
209*130d950cSDimitry Andric                return False
210*130d950cSDimitry Andric
211*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
212*130d950cSDimitry Andric
213*130d950cSDimitry Andric        def __ne__(self, rhs):
214*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
215*130d950cSDimitry Andric                return True
216*130d950cSDimitry Andric
217*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
218*130d950cSDimitry Andric    %}
219*130d950cSDimitry Andric}
220*130d950cSDimitry Andric
221*130d950cSDimitry Andric%extend lldb::SBTypeSummary {
222*130d950cSDimitry Andric    %pythoncode %{
223*130d950cSDimitry Andric        def __eq__(self, rhs):
224*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
225*130d950cSDimitry Andric                return False
226*130d950cSDimitry Andric
227*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
228*130d950cSDimitry Andric
229*130d950cSDimitry Andric        def __ne__(self, rhs):
230*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
231*130d950cSDimitry Andric                return True
232*130d950cSDimitry Andric
233*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
234*130d950cSDimitry Andric    %}
235*130d950cSDimitry Andric}
236*130d950cSDimitry Andric
237*130d950cSDimitry Andric%extend lldb::SBTypeSynthetic {
238*130d950cSDimitry Andric    %pythoncode %{
239*130d950cSDimitry Andric        def __eq__(self, rhs):
240*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
241*130d950cSDimitry Andric                return False
242*130d950cSDimitry Andric
243*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
244*130d950cSDimitry Andric
245*130d950cSDimitry Andric        def __ne__(self, rhs):
246*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
247*130d950cSDimitry Andric                return True
248*130d950cSDimitry Andric
249*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
250*130d950cSDimitry Andric    %}
251*130d950cSDimitry Andric}
252*130d950cSDimitry Andric
253*130d950cSDimitry Andric%extend lldb::SBThread {
254*130d950cSDimitry Andric    %pythoncode %{
255*130d950cSDimitry Andric        def __eq__(self, rhs):
256*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
257*130d950cSDimitry Andric                return False
258*130d950cSDimitry Andric
259*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
260*130d950cSDimitry Andric
261*130d950cSDimitry Andric        def __ne__(self, rhs):
262*130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
263*130d950cSDimitry Andric                return True
264*130d950cSDimitry Andric
265*130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
266*130d950cSDimitry Andric    %}
267*130d950cSDimitry Andric}
268*130d950cSDimitry Andric
269*130d950cSDimitry Andric%pythoncode %{
270*130d950cSDimitry Andric
271*130d950cSDimitry Andricdef command(command_name=None, doc=None):
272*130d950cSDimitry Andric    import lldb
273*130d950cSDimitry Andric    """A decorator function that registers an LLDB command line
274*130d950cSDimitry Andric        command that is bound to the function it is attached to."""
275*130d950cSDimitry Andric    def callable(function):
276*130d950cSDimitry Andric        """Registers an lldb command for the decorated function."""
277*130d950cSDimitry Andric        command = "command script add -f %s.%s %s" % (function.__module__, function.__name__, command_name or function.__name__)
278*130d950cSDimitry Andric        lldb.debugger.HandleCommand(command)
279*130d950cSDimitry Andric        if doc:
280*130d950cSDimitry Andric            function.__doc__ = doc
281*130d950cSDimitry Andric        return function
282*130d950cSDimitry Andric
283*130d950cSDimitry Andric    return callable
284*130d950cSDimitry Andric
285*130d950cSDimitry Andricclass declaration(object):
286*130d950cSDimitry Andric    '''A class that represents a source declaration location with file, line and column.'''
287*130d950cSDimitry Andric    def __init__(self, file, line, col):
288*130d950cSDimitry Andric        self.file = file
289*130d950cSDimitry Andric        self.line = line
290*130d950cSDimitry Andric        self.col = col
291*130d950cSDimitry Andric
292*130d950cSDimitry Andricclass value_iter(object):
293*130d950cSDimitry Andric    def __iter__(self):
294*130d950cSDimitry Andric        return self
295*130d950cSDimitry Andric
296*130d950cSDimitry Andric    def __next__(self):
297*130d950cSDimitry Andric        if self.index >= self.length:
298*130d950cSDimitry Andric            raise StopIteration()
299*130d950cSDimitry Andric        child_sbvalue = self.sbvalue.GetChildAtIndex(self.index)
300*130d950cSDimitry Andric        self.index += 1
301*130d950cSDimitry Andric        return value(child_sbvalue)
302*130d950cSDimitry Andric
303*130d950cSDimitry Andric    def next(self):
304*130d950cSDimitry Andric        return self.__next__()
305*130d950cSDimitry Andric
306*130d950cSDimitry Andric    def __init__(self,value):
307*130d950cSDimitry Andric        self.index = 0
308*130d950cSDimitry Andric        self.sbvalue = value
309*130d950cSDimitry Andric        if type(self.sbvalue) is value:
310*130d950cSDimitry Andric            self.sbvalue = self.sbvalue.sbvalue
311*130d950cSDimitry Andric        self.length = self.sbvalue.GetNumChildren()
312*130d950cSDimitry Andric
313*130d950cSDimitry Andricclass value(object):
314*130d950cSDimitry Andric    '''A class designed to wrap lldb.SBValue() objects so the resulting object
315*130d950cSDimitry Andric    can be used as a variable would be in code. So if you have a Point structure
316*130d950cSDimitry Andric    variable in your code in the current frame named "pt", you can initialize an instance
317*130d950cSDimitry Andric    of this class with it:
318*130d950cSDimitry Andric
319*130d950cSDimitry Andric    pt = lldb.value(lldb.frame.FindVariable("pt"))
320*130d950cSDimitry Andric    print pt
321*130d950cSDimitry Andric    print pt.x
322*130d950cSDimitry Andric    print pt.y
323*130d950cSDimitry Andric
324*130d950cSDimitry Andric    pt = lldb.value(lldb.frame.FindVariable("rectangle_array"))
325*130d950cSDimitry Andric    print rectangle_array[12]
326*130d950cSDimitry Andric    print rectangle_array[5].origin.x'''
327*130d950cSDimitry Andric    def __init__(self, sbvalue):
328*130d950cSDimitry Andric        self.sbvalue = sbvalue
329*130d950cSDimitry Andric
330*130d950cSDimitry Andric    def __nonzero__(self):
331*130d950cSDimitry Andric        return self.sbvalue.__nonzero__()
332*130d950cSDimitry Andric
333*130d950cSDimitry Andric    def __bool__(self):
334*130d950cSDimitry Andric        return self.sbvalue.__bool__()
335*130d950cSDimitry Andric
336*130d950cSDimitry Andric    def __str__(self):
337*130d950cSDimitry Andric        return self.sbvalue.__str__()
338*130d950cSDimitry Andric
339*130d950cSDimitry Andric    def __getitem__(self, key):
340*130d950cSDimitry Andric        # Allow array access if this value has children...
341*130d950cSDimitry Andric        if type(key) is value:
342*130d950cSDimitry Andric            key = int(key)
343*130d950cSDimitry Andric        if type(key) is int:
344*130d950cSDimitry Andric            child_sbvalue = (self.sbvalue.GetValueForExpressionPath("[%i]" % key))
345*130d950cSDimitry Andric            if child_sbvalue and child_sbvalue.IsValid():
346*130d950cSDimitry Andric                return value(child_sbvalue)
347*130d950cSDimitry Andric            raise IndexError("Index '%d' is out of range" % key)
348*130d950cSDimitry Andric        raise TypeError("No array item of type %s" % str(type(key)))
349*130d950cSDimitry Andric
350*130d950cSDimitry Andric    def __iter__(self):
351*130d950cSDimitry Andric        return value_iter(self.sbvalue)
352*130d950cSDimitry Andric
353*130d950cSDimitry Andric    def __getattr__(self, name):
354*130d950cSDimitry Andric        child_sbvalue = self.sbvalue.GetChildMemberWithName (name)
355*130d950cSDimitry Andric        if child_sbvalue and child_sbvalue.IsValid():
356*130d950cSDimitry Andric            return value(child_sbvalue)
357*130d950cSDimitry Andric        raise AttributeError("Attribute '%s' is not defined" % name)
358*130d950cSDimitry Andric
359*130d950cSDimitry Andric    def __add__(self, other):
360*130d950cSDimitry Andric        return int(self) + int(other)
361*130d950cSDimitry Andric
362*130d950cSDimitry Andric    def __sub__(self, other):
363*130d950cSDimitry Andric        return int(self) - int(other)
364*130d950cSDimitry Andric
365*130d950cSDimitry Andric    def __mul__(self, other):
366*130d950cSDimitry Andric        return int(self) * int(other)
367*130d950cSDimitry Andric
368*130d950cSDimitry Andric    def __floordiv__(self, other):
369*130d950cSDimitry Andric        return int(self) // int(other)
370*130d950cSDimitry Andric
371*130d950cSDimitry Andric    def __mod__(self, other):
372*130d950cSDimitry Andric        return int(self) % int(other)
373*130d950cSDimitry Andric
374*130d950cSDimitry Andric    def __divmod__(self, other):
375*130d950cSDimitry Andric        return int(self) % int(other)
376*130d950cSDimitry Andric
377*130d950cSDimitry Andric    def __pow__(self, other):
378*130d950cSDimitry Andric        return int(self) ** int(other)
379*130d950cSDimitry Andric
380*130d950cSDimitry Andric    def __lshift__(self, other):
381*130d950cSDimitry Andric        return int(self) << int(other)
382*130d950cSDimitry Andric
383*130d950cSDimitry Andric    def __rshift__(self, other):
384*130d950cSDimitry Andric        return int(self) >> int(other)
385*130d950cSDimitry Andric
386*130d950cSDimitry Andric    def __and__(self, other):
387*130d950cSDimitry Andric        return int(self) & int(other)
388*130d950cSDimitry Andric
389*130d950cSDimitry Andric    def __xor__(self, other):
390*130d950cSDimitry Andric        return int(self) ^ int(other)
391*130d950cSDimitry Andric
392*130d950cSDimitry Andric    def __or__(self, other):
393*130d950cSDimitry Andric        return int(self) | int(other)
394*130d950cSDimitry Andric
395*130d950cSDimitry Andric    def __div__(self, other):
396*130d950cSDimitry Andric        return int(self) / int(other)
397*130d950cSDimitry Andric
398*130d950cSDimitry Andric    def __truediv__(self, other):
399*130d950cSDimitry Andric        return int(self) / int(other)
400*130d950cSDimitry Andric
401*130d950cSDimitry Andric    def __iadd__(self, other):
402*130d950cSDimitry Andric        result = self.__add__(other)
403*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
404*130d950cSDimitry Andric        return result
405*130d950cSDimitry Andric
406*130d950cSDimitry Andric    def __isub__(self, other):
407*130d950cSDimitry Andric        result = self.__sub__(other)
408*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
409*130d950cSDimitry Andric        return result
410*130d950cSDimitry Andric
411*130d950cSDimitry Andric    def __imul__(self, other):
412*130d950cSDimitry Andric        result = self.__mul__(other)
413*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
414*130d950cSDimitry Andric        return result
415*130d950cSDimitry Andric
416*130d950cSDimitry Andric    def __idiv__(self, other):
417*130d950cSDimitry Andric        result = self.__div__(other)
418*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
419*130d950cSDimitry Andric        return result
420*130d950cSDimitry Andric
421*130d950cSDimitry Andric    def __itruediv__(self, other):
422*130d950cSDimitry Andric        result = self.__truediv__(other)
423*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
424*130d950cSDimitry Andric        return result
425*130d950cSDimitry Andric
426*130d950cSDimitry Andric    def __ifloordiv__(self, other):
427*130d950cSDimitry Andric        result =  self.__floordiv__(self, other)
428*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
429*130d950cSDimitry Andric        return result
430*130d950cSDimitry Andric
431*130d950cSDimitry Andric    def __imod__(self, other):
432*130d950cSDimitry Andric        result =  self.__and__(self, other)
433*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
434*130d950cSDimitry Andric        return result
435*130d950cSDimitry Andric
436*130d950cSDimitry Andric    def __ipow__(self, other):
437*130d950cSDimitry Andric        result = self.__pow__(self, other)
438*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
439*130d950cSDimitry Andric        return result
440*130d950cSDimitry Andric
441*130d950cSDimitry Andric    def __ipow__(self, other, modulo):
442*130d950cSDimitry Andric        result = self.__pow__(self, other, modulo)
443*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
444*130d950cSDimitry Andric        return result
445*130d950cSDimitry Andric
446*130d950cSDimitry Andric    def __ilshift__(self, other):
447*130d950cSDimitry Andric        result = self.__lshift__(other)
448*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
449*130d950cSDimitry Andric        return result
450*130d950cSDimitry Andric
451*130d950cSDimitry Andric    def __irshift__(self, other):
452*130d950cSDimitry Andric        result =  self.__rshift__(other)
453*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
454*130d950cSDimitry Andric        return result
455*130d950cSDimitry Andric
456*130d950cSDimitry Andric    def __iand__(self, other):
457*130d950cSDimitry Andric        result =  self.__and__(self, other)
458*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
459*130d950cSDimitry Andric        return result
460*130d950cSDimitry Andric
461*130d950cSDimitry Andric    def __ixor__(self, other):
462*130d950cSDimitry Andric        result =  self.__xor__(self, other)
463*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
464*130d950cSDimitry Andric        return result
465*130d950cSDimitry Andric
466*130d950cSDimitry Andric    def __ior__(self, other):
467*130d950cSDimitry Andric        result =  self.__ior__(self, other)
468*130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
469*130d950cSDimitry Andric        return result
470*130d950cSDimitry Andric
471*130d950cSDimitry Andric    def __neg__(self):
472*130d950cSDimitry Andric        return -int(self)
473*130d950cSDimitry Andric
474*130d950cSDimitry Andric    def __pos__(self):
475*130d950cSDimitry Andric        return +int(self)
476*130d950cSDimitry Andric
477*130d950cSDimitry Andric    def __abs__(self):
478*130d950cSDimitry Andric        return abs(int(self))
479*130d950cSDimitry Andric
480*130d950cSDimitry Andric    def __invert__(self):
481*130d950cSDimitry Andric        return ~int(self)
482*130d950cSDimitry Andric
483*130d950cSDimitry Andric    def __complex__(self):
484*130d950cSDimitry Andric        return complex (int(self))
485*130d950cSDimitry Andric
486*130d950cSDimitry Andric    def __int__(self):
487*130d950cSDimitry Andric        is_num,is_sign = is_numeric_type(self.sbvalue.GetType().GetCanonicalType().GetBasicType())
488*130d950cSDimitry Andric        if is_num and not is_sign: return self.sbvalue.GetValueAsUnsigned()
489*130d950cSDimitry Andric        return self.sbvalue.GetValueAsSigned()
490*130d950cSDimitry Andric
491*130d950cSDimitry Andric    def __long__(self):
492*130d950cSDimitry Andric        return self.__int__()
493*130d950cSDimitry Andric
494*130d950cSDimitry Andric    def __float__(self):
495*130d950cSDimitry Andric        return float (self.sbvalue.GetValueAsSigned())
496*130d950cSDimitry Andric
497*130d950cSDimitry Andric    def __oct__(self):
498*130d950cSDimitry Andric        return '0%o' % self.sbvalue.GetValueAsUnsigned()
499*130d950cSDimitry Andric
500*130d950cSDimitry Andric    def __hex__(self):
501*130d950cSDimitry Andric        return '0x%x' % self.sbvalue.GetValueAsUnsigned()
502*130d950cSDimitry Andric
503*130d950cSDimitry Andric    def __len__(self):
504*130d950cSDimitry Andric        return self.sbvalue.GetNumChildren()
505*130d950cSDimitry Andric
506*130d950cSDimitry Andric    def __eq__(self, other):
507*130d950cSDimitry Andric        if type(other) is int:
508*130d950cSDimitry Andric                return int(self) == other
509*130d950cSDimitry Andric        elif type(other) is str:
510*130d950cSDimitry Andric                return str(self) == other
511*130d950cSDimitry Andric        elif type(other) is value:
512*130d950cSDimitry Andric                self_err = SBError()
513*130d950cSDimitry Andric                other_err = SBError()
514*130d950cSDimitry Andric                self_val = self.sbvalue.GetValueAsUnsigned(self_err)
515*130d950cSDimitry Andric                if self_err.fail:
516*130d950cSDimitry Andric                        raise ValueError("unable to extract value of self")
517*130d950cSDimitry Andric                other_val = other.sbvalue.GetValueAsUnsigned(other_err)
518*130d950cSDimitry Andric                if other_err.fail:
519*130d950cSDimitry Andric                        raise ValueError("unable to extract value of other")
520*130d950cSDimitry Andric                return self_val == other_val
521*130d950cSDimitry Andric        raise TypeError("Unknown type %s, No equality operation defined." % str(type(other)))
522*130d950cSDimitry Andric
523*130d950cSDimitry Andric    def __ne__(self, other):
524*130d950cSDimitry Andric        return not self.__eq__(other)
525*130d950cSDimitry Andric%}
526*130d950cSDimitry Andric
527*130d950cSDimitry Andric%pythoncode %{
528*130d950cSDimitry Andric
529*130d950cSDimitry Andricclass SBSyntheticValueProvider(object):
530*130d950cSDimitry Andric    def __init__(self,valobj):
531*130d950cSDimitry Andric        pass
532*130d950cSDimitry Andric
533*130d950cSDimitry Andric    def num_children(self):
534*130d950cSDimitry Andric        return 0
535*130d950cSDimitry Andric
536*130d950cSDimitry Andric    def get_child_index(self,name):
537*130d950cSDimitry Andric        return None
538*130d950cSDimitry Andric
539*130d950cSDimitry Andric    def get_child_at_index(self,idx):
540*130d950cSDimitry Andric        return None
541*130d950cSDimitry Andric
542*130d950cSDimitry Andric    def update(self):
543*130d950cSDimitry Andric        pass
544*130d950cSDimitry Andric
545*130d950cSDimitry Andric    def has_children(self):
546*130d950cSDimitry Andric        return False
547*130d950cSDimitry Andric
548*130d950cSDimitry Andric
549*130d950cSDimitry Andric%}
550*130d950cSDimitry Andric
551*130d950cSDimitry Andric%pythoncode %{
552*130d950cSDimitry Andric
553*130d950cSDimitry Andric# given an lldb.SBBasicType it returns a tuple
554*130d950cSDimitry Andric# (is_numeric, is_signed)
555*130d950cSDimitry Andric# the value of is_signed is undefined if is_numeric == false
556*130d950cSDimitry Andricdef is_numeric_type(basic_type):
557*130d950cSDimitry Andric    if basic_type == eBasicTypeInvalid: return (False,False)
558*130d950cSDimitry Andric    if basic_type == eBasicTypeVoid: return (False,False)
559*130d950cSDimitry Andric    if basic_type == eBasicTypeChar: return (True,False)
560*130d950cSDimitry Andric    if basic_type == eBasicTypeSignedChar: return (True,True)
561*130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedChar: return (True,False)
562*130d950cSDimitry Andric    if basic_type == eBasicTypeWChar: return (True,False)
563*130d950cSDimitry Andric    if basic_type == eBasicTypeSignedWChar: return (True,True)
564*130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedWChar: return (True,False)
565*130d950cSDimitry Andric    if basic_type == eBasicTypeChar16: return (True,False)
566*130d950cSDimitry Andric    if basic_type == eBasicTypeChar32: return (True,False)
567*130d950cSDimitry Andric    if basic_type == eBasicTypeShort: return (True,True)
568*130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedShort: return (True,False)
569*130d950cSDimitry Andric    if basic_type == eBasicTypeInt: return (True,True)
570*130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedInt: return (True,False)
571*130d950cSDimitry Andric    if basic_type == eBasicTypeLong: return (True,True)
572*130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedLong: return (True,False)
573*130d950cSDimitry Andric    if basic_type == eBasicTypeLongLong: return (True,True)
574*130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedLongLong: return (True,False)
575*130d950cSDimitry Andric    if basic_type == eBasicTypeInt128: return (True,True)
576*130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedInt128: return (True,False)
577*130d950cSDimitry Andric    if basic_type == eBasicTypeBool: return (False,False)
578*130d950cSDimitry Andric    if basic_type == eBasicTypeHalf: return (True,True)
579*130d950cSDimitry Andric    if basic_type == eBasicTypeFloat: return (True,True)
580*130d950cSDimitry Andric    if basic_type == eBasicTypeDouble: return (True,True)
581*130d950cSDimitry Andric    if basic_type == eBasicTypeLongDouble: return (True,True)
582*130d950cSDimitry Andric    if basic_type == eBasicTypeFloatComplex: return (True,True)
583*130d950cSDimitry Andric    if basic_type == eBasicTypeDoubleComplex: return (True,True)
584*130d950cSDimitry Andric    if basic_type == eBasicTypeLongDoubleComplex: return (True,True)
585*130d950cSDimitry Andric    if basic_type == eBasicTypeObjCID: return (False,False)
586*130d950cSDimitry Andric    if basic_type == eBasicTypeObjCClass: return (False,False)
587*130d950cSDimitry Andric    if basic_type == eBasicTypeObjCSel: return (False,False)
588*130d950cSDimitry Andric    if basic_type == eBasicTypeNullPtr: return (False,False)
589*130d950cSDimitry Andric    #if basic_type == eBasicTypeOther:
590*130d950cSDimitry Andric    return (False,False)
591*130d950cSDimitry Andric
592*130d950cSDimitry Andric%}
593