xref: /freebsd-src/contrib/llvm-project/lldb/bindings/python/python-extensions.swig (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
1130d950cSDimitry Andric%extend lldb::SBBreakpoint {
2130d950cSDimitry Andric    %pythoncode %{
3130d950cSDimitry Andric        def __eq__(self, rhs):
4130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
5130d950cSDimitry Andric                return False
6130d950cSDimitry Andric
7130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
8130d950cSDimitry Andric
9130d950cSDimitry Andric        def __ne__(self, rhs):
10130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
11130d950cSDimitry Andric                return True
12130d950cSDimitry Andric
13130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
14130d950cSDimitry Andric    %}
15130d950cSDimitry Andric}
16130d950cSDimitry Andric
17130d950cSDimitry Andric%extend lldb::SBBroadcaster {
18130d950cSDimitry Andric    %pythoncode %{
19130d950cSDimitry Andric        def __eq__(self, rhs):
20130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
21130d950cSDimitry Andric                return False
22130d950cSDimitry Andric
23130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
24130d950cSDimitry Andric
25130d950cSDimitry Andric        def __ne__(self, rhs):
26130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
27130d950cSDimitry Andric                return True
28130d950cSDimitry Andric
29130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
30130d950cSDimitry Andric    %}
31130d950cSDimitry Andric}
32130d950cSDimitry Andric
33130d950cSDimitry Andric%extend lldb::SBCommandReturnObject {
34130d950cSDimitry Andric        /* the write() and flush() calls are not part of the SB API proper, and are solely for Python usage
35130d950cSDimitry Andric        they are meant to make an SBCommandReturnObject into a file-like object so that instructions of the sort
36130d950cSDimitry Andric        print >>sb_command_return_object, "something"
37130d950cSDimitry Andric        will work correctly */
38130d950cSDimitry Andric
39130d950cSDimitry Andric        void lldb::SBCommandReturnObject::write (const char* str)
40130d950cSDimitry Andric        {
41130d950cSDimitry Andric            if (str)
42130d950cSDimitry Andric                $self->Printf("%s",str);
43130d950cSDimitry Andric        }
44130d950cSDimitry Andric        void lldb::SBCommandReturnObject::flush ()
45130d950cSDimitry Andric        {}
46130d950cSDimitry Andric}
47130d950cSDimitry Andric
48130d950cSDimitry Andric%extend lldb::SBCompileUnit {
49130d950cSDimitry Andric    %pythoncode %{
50130d950cSDimitry Andric        def __eq__(self, rhs):
51130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
52130d950cSDimitry Andric                return False
53130d950cSDimitry Andric
54130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
55130d950cSDimitry Andric
56130d950cSDimitry Andric        def __ne__(self, rhs):
57130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
58130d950cSDimitry Andric                return True
59130d950cSDimitry Andric
60130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
61130d950cSDimitry Andric    %}
62130d950cSDimitry Andric}
63130d950cSDimitry Andric
64130d950cSDimitry Andric%extend lldb::SBDeclaration {
65130d950cSDimitry Andric    %pythoncode %{
66130d950cSDimitry Andric        def __eq__(self, rhs):
67130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
68130d950cSDimitry Andric                return False
69130d950cSDimitry Andric
70130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
71130d950cSDimitry Andric
72130d950cSDimitry Andric        def __ne__(self, rhs):
73130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
74130d950cSDimitry Andric                return True
75130d950cSDimitry Andric
76130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
77130d950cSDimitry Andric    %}
78130d950cSDimitry Andric}
79130d950cSDimitry Andric
80130d950cSDimitry Andric%extend lldb::SBFunction {
81130d950cSDimitry Andric    %pythoncode %{
82130d950cSDimitry Andric        def __eq__(self, rhs):
83130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
84130d950cSDimitry Andric                return False
85130d950cSDimitry Andric
86130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
87130d950cSDimitry Andric
88130d950cSDimitry Andric        def __ne__(self, rhs):
89130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
90130d950cSDimitry Andric                return True
91130d950cSDimitry Andric
92130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
93130d950cSDimitry Andric    %}
94130d950cSDimitry Andric}
95130d950cSDimitry Andric
96130d950cSDimitry Andric%extend lldb::SBLineEntry {
97130d950cSDimitry Andric    %pythoncode %{
98130d950cSDimitry Andric        def __eq__(self, rhs):
99130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
100130d950cSDimitry Andric                return False
101130d950cSDimitry Andric
102130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
103130d950cSDimitry Andric
104130d950cSDimitry Andric        def __ne__(self, rhs):
105130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
106130d950cSDimitry Andric                return True
107130d950cSDimitry Andric
108130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
109130d950cSDimitry Andric    %}
110130d950cSDimitry Andric}
111130d950cSDimitry Andric
112130d950cSDimitry Andric%extend lldb::SBModule {
113130d950cSDimitry Andric    %pythoncode %{
114130d950cSDimitry Andric        def __eq__(self, rhs):
115130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
116130d950cSDimitry Andric                return False
117130d950cSDimitry Andric
118130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
119130d950cSDimitry Andric
120130d950cSDimitry Andric        def __ne__(self, rhs):
121130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
122130d950cSDimitry Andric                return True
123130d950cSDimitry Andric
124130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
125130d950cSDimitry Andric    %}
126130d950cSDimitry Andric}
127130d950cSDimitry Andric
128130d950cSDimitry Andric%extend lldb::SBSection {
129130d950cSDimitry Andric    %pythoncode %{
130130d950cSDimitry Andric        def __eq__(self, rhs):
131130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
132130d950cSDimitry Andric                return False
133130d950cSDimitry Andric
134130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
135130d950cSDimitry Andric
136130d950cSDimitry Andric        def __ne__(self, rhs):
137130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
138130d950cSDimitry Andric                return True
139130d950cSDimitry Andric
140130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
141130d950cSDimitry Andric    %}
142130d950cSDimitry Andric}
143130d950cSDimitry Andric%extend lldb::SBStream {
144130d950cSDimitry Andric        /* the write() and flush() calls are not part of the SB API proper, and are solely for Python usage
145130d950cSDimitry Andric        they are meant to make an SBStream into a file-like object so that instructions of the sort
146130d950cSDimitry Andric        print >>sb_stream, "something"
147130d950cSDimitry Andric        will work correctly */
148130d950cSDimitry Andric
149130d950cSDimitry Andric        void lldb::SBStream::write (const char* str)
150130d950cSDimitry Andric        {
151130d950cSDimitry Andric            if (str)
152130d950cSDimitry Andric                $self->Printf("%s",str);
153130d950cSDimitry Andric        }
154130d950cSDimitry Andric        void lldb::SBStream::flush ()
155130d950cSDimitry Andric        {}
156130d950cSDimitry Andric}
157130d950cSDimitry Andric%extend lldb::SBSymbol {
158130d950cSDimitry Andric    %pythoncode %{
159130d950cSDimitry Andric        def __eq__(self, rhs):
160130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
161130d950cSDimitry Andric                return False
162130d950cSDimitry Andric
163130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
164130d950cSDimitry Andric
165130d950cSDimitry Andric        def __ne__(self, rhs):
166130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
167130d950cSDimitry Andric                return True
168130d950cSDimitry Andric
169130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
170130d950cSDimitry Andric    %}
171130d950cSDimitry Andric}
172130d950cSDimitry Andric
173130d950cSDimitry Andric%extend lldb::SBTarget {
174130d950cSDimitry Andric    %pythoncode %{
175130d950cSDimitry Andric        def __eq__(self, rhs):
176130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
177130d950cSDimitry Andric                return False
178130d950cSDimitry Andric
179130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
180130d950cSDimitry Andric
181130d950cSDimitry Andric        def __ne__(self, rhs):
182130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
183130d950cSDimitry Andric                return True
184130d950cSDimitry Andric
185130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
186130d950cSDimitry Andric    %}
187130d950cSDimitry Andric}
188130d950cSDimitry Andric
189130d950cSDimitry Andric%extend lldb::SBTypeFilter {
190130d950cSDimitry Andric    %pythoncode %{
191130d950cSDimitry Andric        def __eq__(self, rhs):
192130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
193130d950cSDimitry Andric                return False
194130d950cSDimitry Andric
195130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
196130d950cSDimitry Andric
197130d950cSDimitry Andric        def __ne__(self, rhs):
198130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
199130d950cSDimitry Andric                return True
200130d950cSDimitry Andric
201130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
202130d950cSDimitry Andric    %}
203130d950cSDimitry Andric}
204130d950cSDimitry Andric
205130d950cSDimitry Andric%extend lldb::SBTypeNameSpecifier {
206130d950cSDimitry Andric    %pythoncode %{
207130d950cSDimitry Andric        def __eq__(self, rhs):
208130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
209130d950cSDimitry Andric                return False
210130d950cSDimitry Andric
211130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
212130d950cSDimitry Andric
213130d950cSDimitry Andric        def __ne__(self, rhs):
214130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
215130d950cSDimitry Andric                return True
216130d950cSDimitry Andric
217130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
218130d950cSDimitry Andric    %}
219130d950cSDimitry Andric}
220130d950cSDimitry Andric
221130d950cSDimitry Andric%extend lldb::SBTypeSummary {
222130d950cSDimitry Andric    %pythoncode %{
223130d950cSDimitry Andric        def __eq__(self, rhs):
224130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
225130d950cSDimitry Andric                return False
226130d950cSDimitry Andric
227130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
228130d950cSDimitry Andric
229130d950cSDimitry Andric        def __ne__(self, rhs):
230130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
231130d950cSDimitry Andric                return True
232130d950cSDimitry Andric
233130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
234130d950cSDimitry Andric    %}
235130d950cSDimitry Andric}
236130d950cSDimitry Andric
237130d950cSDimitry Andric%extend lldb::SBTypeSynthetic {
238130d950cSDimitry Andric    %pythoncode %{
239130d950cSDimitry Andric        def __eq__(self, rhs):
240130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
241130d950cSDimitry Andric                return False
242130d950cSDimitry Andric
243130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
244130d950cSDimitry Andric
245130d950cSDimitry Andric        def __ne__(self, rhs):
246130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
247130d950cSDimitry Andric                return True
248130d950cSDimitry Andric
249130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
250130d950cSDimitry Andric    %}
251130d950cSDimitry Andric}
252130d950cSDimitry Andric
253130d950cSDimitry Andric%extend lldb::SBThread {
254130d950cSDimitry Andric    %pythoncode %{
255130d950cSDimitry Andric        def __eq__(self, rhs):
256130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
257130d950cSDimitry Andric                return False
258130d950cSDimitry Andric
259130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs)
260130d950cSDimitry Andric
261130d950cSDimitry Andric        def __ne__(self, rhs):
262130d950cSDimitry Andric            if not isinstance(rhs, type(self)):
263130d950cSDimitry Andric                return True
264130d950cSDimitry Andric
265130d950cSDimitry Andric            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
266130d950cSDimitry Andric    %}
267130d950cSDimitry Andric}
268130d950cSDimitry Andric
269130d950cSDimitry Andric%pythoncode %{
270130d950cSDimitry Andric
271130d950cSDimitry Andricdef command(command_name=None, doc=None):
272130d950cSDimitry Andric    import lldb
273130d950cSDimitry Andric    """A decorator function that registers an LLDB command line
274130d950cSDimitry Andric        command that is bound to the function it is attached to."""
275130d950cSDimitry Andric    def callable(function):
276130d950cSDimitry Andric        """Registers an lldb command for the decorated function."""
277130d950cSDimitry Andric        command = "command script add -f %s.%s %s" % (function.__module__, function.__name__, command_name or function.__name__)
278130d950cSDimitry Andric        lldb.debugger.HandleCommand(command)
279130d950cSDimitry Andric        if doc:
280130d950cSDimitry Andric            function.__doc__ = doc
281130d950cSDimitry Andric        return function
282130d950cSDimitry Andric
283130d950cSDimitry Andric    return callable
284130d950cSDimitry Andric
285130d950cSDimitry Andricclass declaration(object):
286130d950cSDimitry Andric    '''A class that represents a source declaration location with file, line and column.'''
287130d950cSDimitry Andric    def __init__(self, file, line, col):
288130d950cSDimitry Andric        self.file = file
289130d950cSDimitry Andric        self.line = line
290130d950cSDimitry Andric        self.col = col
291130d950cSDimitry Andric
292130d950cSDimitry Andricclass value_iter(object):
293e8d8bef9SDimitry Andric    '''Allows iterating over the children of an :py:class:`SBValue`.'''
294130d950cSDimitry Andric    def __iter__(self):
295130d950cSDimitry Andric        return self
296130d950cSDimitry Andric
297130d950cSDimitry Andric    def __next__(self):
298130d950cSDimitry Andric        if self.index >= self.length:
299130d950cSDimitry Andric            raise StopIteration()
300130d950cSDimitry Andric        child_sbvalue = self.sbvalue.GetChildAtIndex(self.index)
301130d950cSDimitry Andric        self.index += 1
302130d950cSDimitry Andric        return value(child_sbvalue)
303130d950cSDimitry Andric
304130d950cSDimitry Andric    def next(self):
305130d950cSDimitry Andric        return self.__next__()
306130d950cSDimitry Andric
307*5f757f3fSDimitry Andric    def __eq__(self, other):
308*5f757f3fSDimitry Andric        return not self.__ne__(other)
309*5f757f3fSDimitry Andric
310*5f757f3fSDimitry Andric    def __len__(self):
311*5f757f3fSDimitry Andric        return self.length
312*5f757f3fSDimitry Andric
313130d950cSDimitry Andric    def __init__(self,value):
314130d950cSDimitry Andric        self.index = 0
315*5f757f3fSDimitry Andric        self.length = 0
316130d950cSDimitry Andric        self.sbvalue = value
317130d950cSDimitry Andric        if type(self.sbvalue) is value:
318130d950cSDimitry Andric            self.sbvalue = self.sbvalue.sbvalue
319130d950cSDimitry Andric        self.length = self.sbvalue.GetNumChildren()
320130d950cSDimitry Andric
321130d950cSDimitry Andricclass value(object):
322e8d8bef9SDimitry Andric    '''Wraps :py:class:`SBValue` objects so the resulting object can be used as a variable would be in code.
323e8d8bef9SDimitry Andric
324e8d8bef9SDimitry Andric    So if you have a Point structure variable in your code in the current frame named "pt",
325e8d8bef9SDimitry Andric    you can initialize an instance of this class with it: ::
326130d950cSDimitry Andric
327130d950cSDimitry Andric        pt = lldb.value(lldb.frame.FindVariable("pt"))
328130d950cSDimitry Andric        print pt
329130d950cSDimitry Andric        print pt.x
330130d950cSDimitry Andric        print pt.y
331130d950cSDimitry Andric
332130d950cSDimitry Andric        pt = lldb.value(lldb.frame.FindVariable("rectangle_array"))
333130d950cSDimitry Andric        print rectangle_array[12]
334130d950cSDimitry Andric        print rectangle_array[5].origin.x'''
335130d950cSDimitry Andric    def __init__(self, sbvalue):
336130d950cSDimitry Andric        self.sbvalue = sbvalue
337130d950cSDimitry Andric
338130d950cSDimitry Andric    def __nonzero__(self):
339130d950cSDimitry Andric        return self.sbvalue.__nonzero__()
340130d950cSDimitry Andric
341130d950cSDimitry Andric    def __bool__(self):
342130d950cSDimitry Andric        return self.sbvalue.__bool__()
343130d950cSDimitry Andric
344130d950cSDimitry Andric    def __str__(self):
345130d950cSDimitry Andric        return self.sbvalue.__str__()
346130d950cSDimitry Andric
347130d950cSDimitry Andric    def __getitem__(self, key):
348130d950cSDimitry Andric        # Allow array access if this value has children...
349130d950cSDimitry Andric        if type(key) is value:
350130d950cSDimitry Andric            key = int(key)
351130d950cSDimitry Andric        if type(key) is int:
352130d950cSDimitry Andric            child_sbvalue = (self.sbvalue.GetValueForExpressionPath("[%i]" % key))
353130d950cSDimitry Andric            if child_sbvalue and child_sbvalue.IsValid():
354130d950cSDimitry Andric                return value(child_sbvalue)
355130d950cSDimitry Andric            raise IndexError("Index '%d' is out of range" % key)
356130d950cSDimitry Andric        raise TypeError("No array item of type %s" % str(type(key)))
357130d950cSDimitry Andric
358130d950cSDimitry Andric    def __iter__(self):
359130d950cSDimitry Andric        return value_iter(self.sbvalue)
360130d950cSDimitry Andric
361130d950cSDimitry Andric    def __getattr__(self, name):
362130d950cSDimitry Andric        child_sbvalue = self.sbvalue.GetChildMemberWithName (name)
363130d950cSDimitry Andric        if child_sbvalue and child_sbvalue.IsValid():
364130d950cSDimitry Andric            return value(child_sbvalue)
365130d950cSDimitry Andric        raise AttributeError("Attribute '%s' is not defined" % name)
366130d950cSDimitry Andric
367130d950cSDimitry Andric    def __add__(self, other):
368130d950cSDimitry Andric        return int(self) + int(other)
369130d950cSDimitry Andric
370130d950cSDimitry Andric    def __sub__(self, other):
371130d950cSDimitry Andric        return int(self) - int(other)
372130d950cSDimitry Andric
373130d950cSDimitry Andric    def __mul__(self, other):
374130d950cSDimitry Andric        return int(self) * int(other)
375130d950cSDimitry Andric
376130d950cSDimitry Andric    def __floordiv__(self, other):
377130d950cSDimitry Andric        return int(self) // int(other)
378130d950cSDimitry Andric
379130d950cSDimitry Andric    def __mod__(self, other):
380130d950cSDimitry Andric        return int(self) % int(other)
381130d950cSDimitry Andric
382130d950cSDimitry Andric    def __divmod__(self, other):
383130d950cSDimitry Andric        return int(self) % int(other)
384130d950cSDimitry Andric
385130d950cSDimitry Andric    def __pow__(self, other):
386130d950cSDimitry Andric        return int(self) ** int(other)
387130d950cSDimitry Andric
388130d950cSDimitry Andric    def __lshift__(self, other):
389130d950cSDimitry Andric        return int(self) << int(other)
390130d950cSDimitry Andric
391130d950cSDimitry Andric    def __rshift__(self, other):
392130d950cSDimitry Andric        return int(self) >> int(other)
393130d950cSDimitry Andric
394130d950cSDimitry Andric    def __and__(self, other):
395130d950cSDimitry Andric        return int(self) & int(other)
396130d950cSDimitry Andric
397130d950cSDimitry Andric    def __xor__(self, other):
398130d950cSDimitry Andric        return int(self) ^ int(other)
399130d950cSDimitry Andric
400130d950cSDimitry Andric    def __or__(self, other):
401130d950cSDimitry Andric        return int(self) | int(other)
402130d950cSDimitry Andric
403130d950cSDimitry Andric    def __div__(self, other):
404130d950cSDimitry Andric        return int(self) / int(other)
405130d950cSDimitry Andric
406130d950cSDimitry Andric    def __truediv__(self, other):
407130d950cSDimitry Andric        return int(self) / int(other)
408130d950cSDimitry Andric
409130d950cSDimitry Andric    def __iadd__(self, other):
410130d950cSDimitry Andric        result = self.__add__(other)
411130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
412130d950cSDimitry Andric        return result
413130d950cSDimitry Andric
414130d950cSDimitry Andric    def __isub__(self, other):
415130d950cSDimitry Andric        result = self.__sub__(other)
416130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
417130d950cSDimitry Andric        return result
418130d950cSDimitry Andric
419130d950cSDimitry Andric    def __imul__(self, other):
420130d950cSDimitry Andric        result = self.__mul__(other)
421130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
422130d950cSDimitry Andric        return result
423130d950cSDimitry Andric
424130d950cSDimitry Andric    def __idiv__(self, other):
425130d950cSDimitry Andric        result = self.__div__(other)
426130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
427130d950cSDimitry Andric        return result
428130d950cSDimitry Andric
429130d950cSDimitry Andric    def __itruediv__(self, other):
430130d950cSDimitry Andric        result = self.__truediv__(other)
431130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
432130d950cSDimitry Andric        return result
433130d950cSDimitry Andric
434130d950cSDimitry Andric    def __ifloordiv__(self, other):
435130d950cSDimitry Andric        result =  self.__floordiv__(self, other)
436130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
437130d950cSDimitry Andric        return result
438130d950cSDimitry Andric
439130d950cSDimitry Andric    def __imod__(self, other):
440130d950cSDimitry Andric        result =  self.__and__(self, other)
441130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
442130d950cSDimitry Andric        return result
443130d950cSDimitry Andric
444130d950cSDimitry Andric    def __ipow__(self, other):
445130d950cSDimitry Andric        result = self.__pow__(self, other)
446130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
447130d950cSDimitry Andric        return result
448130d950cSDimitry Andric
449130d950cSDimitry Andric    def __ipow__(self, other, modulo):
450130d950cSDimitry Andric        result = self.__pow__(self, other, modulo)
451130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
452130d950cSDimitry Andric        return result
453130d950cSDimitry Andric
454130d950cSDimitry Andric    def __ilshift__(self, other):
455130d950cSDimitry Andric        result = self.__lshift__(other)
456130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
457130d950cSDimitry Andric        return result
458130d950cSDimitry Andric
459130d950cSDimitry Andric    def __irshift__(self, other):
460130d950cSDimitry Andric        result =  self.__rshift__(other)
461130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
462130d950cSDimitry Andric        return result
463130d950cSDimitry Andric
464130d950cSDimitry Andric    def __iand__(self, other):
465130d950cSDimitry Andric        result =  self.__and__(self, other)
466130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
467130d950cSDimitry Andric        return result
468130d950cSDimitry Andric
469130d950cSDimitry Andric    def __ixor__(self, other):
470130d950cSDimitry Andric        result =  self.__xor__(self, other)
471130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
472130d950cSDimitry Andric        return result
473130d950cSDimitry Andric
474130d950cSDimitry Andric    def __ior__(self, other):
475130d950cSDimitry Andric        result =  self.__ior__(self, other)
476130d950cSDimitry Andric        self.sbvalue.SetValueFromCString (str(result))
477130d950cSDimitry Andric        return result
478130d950cSDimitry Andric
479130d950cSDimitry Andric    def __neg__(self):
480130d950cSDimitry Andric        return -int(self)
481130d950cSDimitry Andric
482130d950cSDimitry Andric    def __pos__(self):
483130d950cSDimitry Andric        return +int(self)
484130d950cSDimitry Andric
485130d950cSDimitry Andric    def __abs__(self):
486130d950cSDimitry Andric        return abs(int(self))
487130d950cSDimitry Andric
488130d950cSDimitry Andric    def __invert__(self):
489130d950cSDimitry Andric        return ~int(self)
490130d950cSDimitry Andric
491130d950cSDimitry Andric    def __complex__(self):
492130d950cSDimitry Andric        return complex (int(self))
493130d950cSDimitry Andric
494130d950cSDimitry Andric    def __int__(self):
495130d950cSDimitry Andric        is_num,is_sign = is_numeric_type(self.sbvalue.GetType().GetCanonicalType().GetBasicType())
496130d950cSDimitry Andric        if is_num and not is_sign: return self.sbvalue.GetValueAsUnsigned()
497130d950cSDimitry Andric        return self.sbvalue.GetValueAsSigned()
498130d950cSDimitry Andric
499130d950cSDimitry Andric    def __long__(self):
500130d950cSDimitry Andric        return self.__int__()
501130d950cSDimitry Andric
502130d950cSDimitry Andric    def __float__(self):
503130d950cSDimitry Andric        return float (self.sbvalue.GetValueAsSigned())
504130d950cSDimitry Andric
505130d950cSDimitry Andric    def __oct__(self):
506130d950cSDimitry Andric        return '0%o' % self.sbvalue.GetValueAsUnsigned()
507130d950cSDimitry Andric
508130d950cSDimitry Andric    def __hex__(self):
509130d950cSDimitry Andric        return '0x%x' % self.sbvalue.GetValueAsUnsigned()
510130d950cSDimitry Andric
511130d950cSDimitry Andric    def __len__(self):
512130d950cSDimitry Andric        return self.sbvalue.GetNumChildren()
513130d950cSDimitry Andric
514130d950cSDimitry Andric    def __eq__(self, other):
515130d950cSDimitry Andric        if type(other) is int:
516130d950cSDimitry Andric                return int(self) == other
517130d950cSDimitry Andric        elif type(other) is str:
518130d950cSDimitry Andric                return str(self) == other
519130d950cSDimitry Andric        elif type(other) is value:
520130d950cSDimitry Andric                self_err = SBError()
521130d950cSDimitry Andric                other_err = SBError()
522130d950cSDimitry Andric                self_val = self.sbvalue.GetValueAsUnsigned(self_err)
523130d950cSDimitry Andric                if self_err.fail:
524130d950cSDimitry Andric                        raise ValueError("unable to extract value of self")
525130d950cSDimitry Andric                other_val = other.sbvalue.GetValueAsUnsigned(other_err)
526130d950cSDimitry Andric                if other_err.fail:
527130d950cSDimitry Andric                        raise ValueError("unable to extract value of other")
528130d950cSDimitry Andric                return self_val == other_val
529130d950cSDimitry Andric        raise TypeError("Unknown type %s, No equality operation defined." % str(type(other)))
530130d950cSDimitry Andric
531130d950cSDimitry Andric    def __ne__(self, other):
532130d950cSDimitry Andric        return not self.__eq__(other)
533130d950cSDimitry Andric%}
534130d950cSDimitry Andric
535130d950cSDimitry Andric%pythoncode %{
536130d950cSDimitry Andric
537130d950cSDimitry Andricclass SBSyntheticValueProvider(object):
538130d950cSDimitry Andric    def __init__(self,valobj):
539130d950cSDimitry Andric        pass
540130d950cSDimitry Andric
541130d950cSDimitry Andric    def num_children(self):
542130d950cSDimitry Andric        return 0
543130d950cSDimitry Andric
544130d950cSDimitry Andric    def get_child_index(self,name):
545130d950cSDimitry Andric        return None
546130d950cSDimitry Andric
547130d950cSDimitry Andric    def get_child_at_index(self,idx):
548130d950cSDimitry Andric        return None
549130d950cSDimitry Andric
550130d950cSDimitry Andric    def update(self):
551130d950cSDimitry Andric        pass
552130d950cSDimitry Andric
553130d950cSDimitry Andric    def has_children(self):
554130d950cSDimitry Andric        return False
555130d950cSDimitry Andric
556*5f757f3fSDimitry Andric    def __len__(self):
557*5f757f3fSDimitry Andric      return self.num_children()
558*5f757f3fSDimitry Andric
559*5f757f3fSDimitry Andric    def __iter__(self):
560*5f757f3fSDimitry Andric      '''Iterate over all children in a lldb.SBSyntheticValueProvider object.'''
561*5f757f3fSDimitry Andric      return lldb_iter(self, 'num_children', 'get_child_at_index')
562130d950cSDimitry Andric
563130d950cSDimitry Andric%}
564130d950cSDimitry Andric
565130d950cSDimitry Andric%pythoncode %{
566130d950cSDimitry Andric
567130d950cSDimitry Andric# given an lldb.SBBasicType it returns a tuple
568130d950cSDimitry Andric# (is_numeric, is_signed)
569130d950cSDimitry Andric# the value of is_signed is undefined if is_numeric == false
570130d950cSDimitry Andricdef is_numeric_type(basic_type):
571130d950cSDimitry Andric    if basic_type == eBasicTypeInvalid: return (False,False)
572130d950cSDimitry Andric    if basic_type == eBasicTypeVoid: return (False,False)
573130d950cSDimitry Andric    if basic_type == eBasicTypeChar: return (True,False)
574130d950cSDimitry Andric    if basic_type == eBasicTypeSignedChar: return (True,True)
575130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedChar: return (True,False)
576130d950cSDimitry Andric    if basic_type == eBasicTypeWChar: return (True,False)
577130d950cSDimitry Andric    if basic_type == eBasicTypeSignedWChar: return (True,True)
578130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedWChar: return (True,False)
579130d950cSDimitry Andric    if basic_type == eBasicTypeChar16: return (True,False)
580130d950cSDimitry Andric    if basic_type == eBasicTypeChar32: return (True,False)
58181ad6265SDimitry Andric    if basic_type == eBasicTypeChar8: return (True,False)
582130d950cSDimitry Andric    if basic_type == eBasicTypeShort: return (True,True)
583130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedShort: return (True,False)
584130d950cSDimitry Andric    if basic_type == eBasicTypeInt: return (True,True)
585130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedInt: return (True,False)
586130d950cSDimitry Andric    if basic_type == eBasicTypeLong: return (True,True)
587130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedLong: return (True,False)
588130d950cSDimitry Andric    if basic_type == eBasicTypeLongLong: return (True,True)
589130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedLongLong: return (True,False)
590130d950cSDimitry Andric    if basic_type == eBasicTypeInt128: return (True,True)
591130d950cSDimitry Andric    if basic_type == eBasicTypeUnsignedInt128: return (True,False)
592130d950cSDimitry Andric    if basic_type == eBasicTypeBool: return (False,False)
593130d950cSDimitry Andric    if basic_type == eBasicTypeHalf: return (True,True)
594130d950cSDimitry Andric    if basic_type == eBasicTypeFloat: return (True,True)
595130d950cSDimitry Andric    if basic_type == eBasicTypeDouble: return (True,True)
596130d950cSDimitry Andric    if basic_type == eBasicTypeLongDouble: return (True,True)
597130d950cSDimitry Andric    if basic_type == eBasicTypeFloatComplex: return (True,True)
598130d950cSDimitry Andric    if basic_type == eBasicTypeDoubleComplex: return (True,True)
599130d950cSDimitry Andric    if basic_type == eBasicTypeLongDoubleComplex: return (True,True)
600130d950cSDimitry Andric    if basic_type == eBasicTypeObjCID: return (False,False)
601130d950cSDimitry Andric    if basic_type == eBasicTypeObjCClass: return (False,False)
602130d950cSDimitry Andric    if basic_type == eBasicTypeObjCSel: return (False,False)
603130d950cSDimitry Andric    if basic_type == eBasicTypeNullPtr: return (False,False)
604130d950cSDimitry Andric    #if basic_type == eBasicTypeOther:
605130d950cSDimitry Andric    return (False,False)
606130d950cSDimitry Andric
607130d950cSDimitry Andric%}
608