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