xref: /freebsd/contrib/llvm-project/lldb/bindings/interface/SBTypeExtensions.i (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
1 STRING_EXTENSION_LEVEL_OUTSIDE(SBTypeMember, lldb::eDescriptionLevelBrief)
2 %extend lldb::SBTypeMember {
3 #ifdef SWIGPYTHON
4     %pythoncode %{
5         # operator== is a free function, which swig does not handle, so we inject
6         # our own equality operator here
7         def __eq__(self, other):
8             return not self.__ne__(other)
9 
10         name = property(GetName, None, doc='''A read only property that returns the name for this member as a string.''')
11         type = property(GetType, None, doc='''A read only property that returns an lldb object that represents the type (lldb.SBType) for this member.''')
12         byte_offset = property(GetOffsetInBytes, None, doc='''A read only property that returns offset in bytes for this member as an integer.''')
13         bit_offset = property(GetOffsetInBits, None, doc='''A read only property that returns offset in bits for this member as an integer.''')
14         is_bitfield = property(IsBitfield, None, doc='''A read only property that returns true if this member is a bitfield.''')
15         bitfield_bit_size = property(GetBitfieldSizeInBits, None, doc='''A read only property that returns the bitfield size in bits for this member as an integer, or zero if this member is not a bitfield.''')
16     %}
17 #endif
18 }
19 
20 STRING_EXTENSION_LEVEL_OUTSIDE(SBTypeMemberFunction, lldb::eDescriptionLevelBrief)
21 
22 %extend lldb::SBTypeMemberFunction {
23 #ifdef SWIGPYTHON
24     %pythoncode%{
25       # operator== is a free function, which swig does not handle, so we inject
26       # our own equality operator here
27       def __eq__(self, other):
28         return not self.__ne__(other)
29 
30     %}
31 #endif
32 }
33 
34 STRING_EXTENSION_LEVEL_OUTSIDE(SBType, lldb::eDescriptionLevelBrief)
35 
36 %extend lldb::SBType {
37 #ifdef SWIGPYTHON
38     %pythoncode %{
39         def template_arg_array(self):
40             num_args = self.num_template_args
41             if num_args:
42                 template_args = []
43                 for i in range(num_args):
44                     template_args.append(self.GetTemplateArgumentType(i))
45                 return template_args
46             return None
47 
48         # operator== is a free function, which swig does not handle, so we inject
49         # our own equality operator here
50         def __eq__(self, other):
51             return not self.__ne__(other)
52 
53         def __len__(self):
54             return self.GetByteSize()
55 
56         module = property(GetModule, None, doc='''A read only property that returns the module in which type is defined.''')
57         name = property(GetName, None, doc='''A read only property that returns the name for this type as a string.''')
58         size = property(GetByteSize, None, doc='''A read only property that returns size in bytes for this type as an integer.''')
59         is_pointer = property(IsPointerType, None, doc='''A read only property that returns a boolean value that indicates if this type is a pointer type.''')
60         is_reference = property(IsReferenceType, None, doc='''A read only property that returns a boolean value that indicates if this type is a reference type.''')
61         is_reference = property(IsReferenceType, None, doc='''A read only property that returns a boolean value that indicates if this type is a function type.''')
62         num_fields = property(GetNumberOfFields, None, doc='''A read only property that returns number of fields in this type as an integer.''')
63         num_bases = property(GetNumberOfDirectBaseClasses, None, doc='''A read only property that returns number of direct base classes in this type as an integer.''')
64         num_vbases = property(GetNumberOfVirtualBaseClasses, None, doc='''A read only property that returns number of virtual base classes in this type as an integer.''')
65         num_template_args = property(GetNumberOfTemplateArguments, None, doc='''A read only property that returns number of template arguments in this type as an integer.''')
66         template_args = property(template_arg_array, None, doc='''A read only property that returns a list() of lldb.SBType objects that represent all template arguments in this type.''')
67         type = property(GetTypeClass, None, doc='''A read only property that returns an lldb enumeration value (see enumerations that start with "lldb.eTypeClass") that represents a classification for this type.''')
68         is_complete = property(IsTypeComplete, None, doc='''A read only property that returns a boolean value that indicates if this type is a complete type (True) or a forward declaration (False).''')
69 
70         def get_bases_array(self):
71             '''An accessor function that returns a list() that contains all direct base classes in a lldb.SBType object.'''
72             bases = []
73             for idx in range(self.GetNumberOfDirectBaseClasses()):
74                 bases.append(self.GetDirectBaseClassAtIndex(idx))
75             return bases
76 
77         def get_vbases_array(self):
78             '''An accessor function that returns a list() that contains all fields in a lldb.SBType object.'''
79             vbases = []
80             for idx in range(self.GetNumberOfVirtualBaseClasses()):
81                 vbases.append(self.GetVirtualBaseClassAtIndex(idx))
82             return vbases
83 
84         def get_fields_array(self):
85             '''An accessor function that returns a list() that contains all fields in a lldb.SBType object.'''
86             fields = []
87             for idx in range(self.GetNumberOfFields()):
88                 fields.append(self.GetFieldAtIndex(idx))
89             return fields
90 
91         def get_members_array(self):
92             '''An accessor function that returns a list() that contains all members (base classes and fields) in a lldb.SBType object in ascending bit offset order.'''
93             members = []
94             bases = self.get_bases_array()
95             fields = self.get_fields_array()
96             vbases = self.get_vbases_array()
97             for base in bases:
98                 bit_offset = base.bit_offset
99                 added = False
100                 for idx, member in enumerate(members):
101                     if member.bit_offset > bit_offset:
102                         members.insert(idx, base)
103                         added = True
104                         break
105                 if not added:
106                     members.append(base)
107             for vbase in vbases:
108                 bit_offset = vbase.bit_offset
109                 added = False
110                 for idx, member in enumerate(members):
111                     if member.bit_offset > bit_offset:
112                         members.insert(idx, vbase)
113                         added = True
114                         break
115                 if not added:
116                     members.append(vbase)
117             for field in fields:
118                 bit_offset = field.bit_offset
119                 added = False
120                 for idx, member in enumerate(members):
121                     if member.bit_offset > bit_offset:
122                         members.insert(idx, field)
123                         added = True
124                         break
125                 if not added:
126                     members.append(field)
127             return members
128 
129         def get_enum_members_array(self):
130             '''An accessor function that returns a list() that contains all enum members in an lldb.SBType object.'''
131             enum_members_list = []
132             sb_enum_members = self.GetEnumMembers()
133             for idx in range(sb_enum_members.GetSize()):
134                 enum_members_list.append(sb_enum_members.GetTypeEnumMemberAtIndex(idx))
135             return enum_members_list
136 
137         bases = property(get_bases_array, None, doc='''A read only property that returns a list() of lldb.SBTypeMember objects that represent all of the direct base classes for this type.''')
138         vbases = property(get_vbases_array, None, doc='''A read only property that returns a list() of lldb.SBTypeMember objects that represent all of the virtual base classes for this type.''')
139         fields = property(get_fields_array, None, doc='''A read only property that returns a list() of lldb.SBTypeMember objects that represent all of the fields for this type.''')
140         members = property(get_members_array, None, doc='''A read only property that returns a list() of all lldb.SBTypeMember objects that represent all of the base classes, virtual base classes and fields for this type in ascending bit offset order.''')
141         enum_members = property(get_enum_members_array, None, doc='''A read only property that returns a list() of all lldb.SBTypeEnumMember objects that represent the enum members for this type.''')
142         %}
143 #endif
144 }
145 
146 %extend lldb::SBTypeList {
147 #ifdef SWIGPYTHON
148     %pythoncode%{
149     # operator== is a free function, which swig does not handle, so we inject
150     # our own equality operator here
151     def __eq__(self, other):
152         return not self.__ne__(other)
153 
154     def __iter__(self):
155         '''Iterate over all types in a lldb.SBTypeList object.'''
156         return lldb_iter(self, 'GetSize', 'GetTypeAtIndex')
157 
158     def __len__(self):
159         '''Return the number of types in a lldb.SBTypeList object.'''
160         return self.GetSize()
161     %}
162 #endif
163 }
164