Home | History | Annotate | Download | only in interface
      1 //===-- SWIG Interface for SBType -------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 namespace lldb {
     11 
     12     %feature("docstring",
     13 "Represents a member of a type in lldb.
     14 ") SBTypeMember;
     15 
     16 class SBTypeMember
     17 {
     18 public:
     19     SBTypeMember ();
     20 
     21     SBTypeMember (const lldb::SBTypeMember& rhs);
     22 
     23     ~SBTypeMember();
     24 
     25     bool
     26     IsValid() const;
     27 
     28     const char *
     29     GetName ();
     30 
     31     lldb::SBType
     32     GetType ();
     33 
     34     uint64_t
     35     GetOffsetInBytes();
     36 
     37     uint64_t
     38     GetOffsetInBits();
     39 
     40     bool
     41     IsBitfield();
     42 
     43     uint32_t
     44     GetBitfieldSizeInBits();
     45 
     46     %pythoncode %{
     47         __swig_getmethods__["name"] = GetName
     48         if _newclass: name = property(GetName, None, doc='''A read only property that returns the name for this member as a string.''')
     49 
     50         __swig_getmethods__["type"] = GetType
     51         if _newclass: type = property(GetType, None, doc='''A read only property that returns an lldb object that represents the type (lldb.SBType) for this member.''')
     52 
     53         __swig_getmethods__["byte_offset"] = GetOffsetInBytes
     54         if _newclass: byte_offset = property(GetOffsetInBytes, None, doc='''A read only property that returns offset in bytes for this member as an integer.''')
     55 
     56         __swig_getmethods__["bit_offset"] = GetOffsetInBits
     57         if _newclass: bit_offset = property(GetOffsetInBits, None, doc='''A read only property that returns offset in bits for this member as an integer.''')
     58 
     59         __swig_getmethods__["is_bitfield"] = IsBitfield
     60         if _newclass: is_bitfield = property(IsBitfield, None, doc='''A read only property that returns true if this member is a bitfield.''')
     61 
     62         __swig_getmethods__["bitfield_bit_size"] = GetBitfieldSizeInBits
     63         if _newclass: 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.''')
     64 
     65     %}
     66 
     67 protected:
     68     std::unique_ptr<lldb_private::TypeMemberImpl> m_opaque_ap;
     69 };
     70 
     71 %feature("docstring",
     72 "Represents a data type in lldb.  The FindFirstType() method of SBTarget/SBModule
     73 returns a SBType.
     74 
     75 SBType supports the eq/ne operator. For example,
     76 
     77 main.cpp:
     78 
     79 class Task {
     80 public:
     81     int id;
     82     Task *next;
     83     Task(int i, Task *n):
     84         id(i),
     85         next(n)
     86     {}
     87 };
     88 
     89 int main (int argc, char const *argv[])
     90 {
     91     Task *task_head = new Task(-1, NULL);
     92     Task *task1 = new Task(1, NULL);
     93     Task *task2 = new Task(2, NULL);
     94     Task *task3 = new Task(3, NULL); // Orphaned.
     95     Task *task4 = new Task(4, NULL);
     96     Task *task5 = new Task(5, NULL);
     97 
     98     task_head->next = task1;
     99     task1->next = task2;
    100     task2->next = task4;
    101     task4->next = task5;
    102 
    103     int total = 0;
    104     Task *t = task_head;
    105     while (t != NULL) {
    106         if (t->id >= 0)
    107             ++total;
    108         t = t->next;
    109     }
    110     printf('We have a total number of %d tasks\\n', total);
    111 
    112     // This corresponds to an empty task list.
    113     Task *empty_task_head = new Task(-1, NULL);
    114 
    115     return 0; // Break at this line
    116 }
    117 
    118 find_type.py:
    119 
    120         # Get the type 'Task'.
    121         task_type = target.FindFirstType('Task')
    122         self.assertTrue(task_type)
    123 
    124         # Get the variable 'task_head'.
    125         frame0.FindVariable('task_head')
    126         task_head_type = task_head.GetType()
    127         self.assertTrue(task_head_type.IsPointerType())
    128 
    129         # task_head_type is 'Task *'.
    130         task_pointer_type = task_type.GetPointerType()
    131         self.assertTrue(task_head_type == task_pointer_type)
    132 
    133         # Get the child mmember 'id' from 'task_head'.
    134         id = task_head.GetChildMemberWithName('id')
    135         id_type = id.GetType()
    136 
    137         # SBType.GetBasicType() takes an enum 'BasicType' (lldb-enumerations.h).
    138         int_type = id_type.GetBasicType(lldb.eBasicTypeInt)
    139         # id_type and int_type should be the same type!
    140         self.assertTrue(id_type == int_type)
    141 
    142 ...
    143 ") SBType;
    144 class SBType
    145 {
    146 public:
    147     SBType ();
    148 
    149     SBType (const lldb::SBType &rhs);
    150 
    151     ~SBType ();
    152 
    153     bool
    154     IsValid();
    155 
    156     uint64_t
    157     GetByteSize();
    158 
    159     bool
    160     IsPointerType();
    161 
    162     bool
    163     IsReferenceType();
    164 
    165     bool
    166     IsFunctionType ();
    167 
    168     bool
    169     IsPolymorphicClass ();
    170 
    171     lldb::SBType
    172     GetPointerType();
    173 
    174     lldb::SBType
    175     GetPointeeType();
    176 
    177     lldb::SBType
    178     GetReferenceType();
    179 
    180     lldb::SBType
    181     GetDereferencedType();
    182 
    183     lldb::SBType
    184     GetUnqualifiedType();
    185 
    186     lldb::SBType
    187     GetCanonicalType();
    188 
    189     lldb::BasicType
    190     GetBasicType();
    191 
    192     lldb::SBType
    193     GetBasicType (lldb::BasicType type);
    194 
    195     uint32_t
    196     GetNumberOfFields ();
    197 
    198     uint32_t
    199     GetNumberOfDirectBaseClasses ();
    200 
    201     uint32_t
    202     GetNumberOfVirtualBaseClasses ();
    203 
    204     lldb::SBTypeMember
    205     GetFieldAtIndex (uint32_t idx);
    206 
    207     lldb::SBTypeMember
    208     GetDirectBaseClassAtIndex (uint32_t idx);
    209 
    210     lldb::SBTypeMember
    211     GetVirtualBaseClassAtIndex (uint32_t idx);
    212 
    213     const char*
    214     GetName();
    215 
    216     lldb::TypeClass
    217     GetTypeClass ();
    218 
    219     uint32_t
    220     GetNumberOfTemplateArguments ();
    221 
    222     lldb::SBType
    223     GetTemplateArgumentType (uint32_t idx);
    224 
    225     lldb::TemplateArgumentKind
    226     GetTemplateArgumentKind (uint32_t idx);
    227 
    228     lldb::SBType
    229     GetFunctionReturnType ();
    230 
    231     lldb::SBTypeList
    232     GetFunctionArgumentTypes ();
    233 
    234     bool
    235     IsTypeComplete ();
    236 
    237     %pythoncode %{
    238         def template_arg_array(self):
    239             num_args = self.num_template_args
    240             if num_args:
    241                 template_args = []
    242                 for i in range(num_args):
    243                     template_args.append(self.GetTemplateArgumentType(i))
    244                 return template_args
    245             return None
    246 
    247         __swig_getmethods__["name"] = GetName
    248         if _newclass: name = property(GetName, None, doc='''A read only property that returns the name for this type as a string.''')
    249 
    250         __swig_getmethods__["size"] = GetByteSize
    251         if _newclass: size = property(GetByteSize, None, doc='''A read only property that returns size in bytes for this type as an integer.''')
    252 
    253         __swig_getmethods__["is_pointer"] = IsPointerType
    254         if _newclass: is_pointer = property(IsPointerType, None, doc='''A read only property that returns a boolean value that indicates if this type is a pointer type.''')
    255 
    256         __swig_getmethods__["is_reference"] = IsReferenceType
    257         if _newclass: is_reference = property(IsReferenceType, None, doc='''A read only property that returns a boolean value that indicates if this type is a reference type.''')
    258 
    259         __swig_getmethods__["is_function"] = IsFunctionType
    260         if _newclass: is_reference = property(IsReferenceType, None, doc='''A read only property that returns a boolean value that indicates if this type is a function type.''')
    261 
    262         __swig_getmethods__["num_fields"] = GetNumberOfFields
    263         if _newclass: num_fields = property(GetNumberOfFields, None, doc='''A read only property that returns number of fields in this type as an integer.''')
    264 
    265         __swig_getmethods__["num_bases"] = GetNumberOfDirectBaseClasses
    266         if _newclass: num_bases = property(GetNumberOfDirectBaseClasses, None, doc='''A read only property that returns number of direct base classes in this type as an integer.''')
    267 
    268         __swig_getmethods__["num_vbases"] = GetNumberOfVirtualBaseClasses
    269         if _newclass: num_vbases = property(GetNumberOfVirtualBaseClasses, None, doc='''A read only property that returns number of virtual base classes in this type as an integer.''')
    270 
    271         __swig_getmethods__["num_template_args"] = GetNumberOfTemplateArguments
    272         if _newclass: num_template_args = property(GetNumberOfTemplateArguments, None, doc='''A read only property that returns number of template arguments in this type as an integer.''')
    273 
    274         __swig_getmethods__["template_args"] = template_arg_array
    275         if _newclass: 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.''')
    276 
    277         __swig_getmethods__["type"] = GetTypeClass
    278         if _newclass: 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.''')
    279 
    280         __swig_getmethods__["is_complete"] = IsTypeComplete
    281         if _newclass: 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).''')
    282 
    283         def get_bases_array(self):
    284             '''An accessor function that returns a list() that contains all direct base classes in a lldb.SBType object.'''
    285             bases = []
    286             for idx in range(self.GetNumberOfDirectBaseClasses()):
    287                 bases.append(self.GetDirectBaseClassAtIndex(idx))
    288             return bases
    289 
    290         def get_vbases_array(self):
    291             '''An accessor function that returns a list() that contains all fields in a lldb.SBType object.'''
    292             vbases = []
    293             for idx in range(self.GetNumberOfVirtualBaseClasses()):
    294                 vbases.append(self.GetVirtualBaseClassAtIndex(idx))
    295             return vbases
    296 
    297         def get_fields_array(self):
    298             '''An accessor function that returns a list() that contains all fields in a lldb.SBType object.'''
    299             fields = []
    300             for idx in range(self.GetNumberOfFields()):
    301                 fields.append(self.GetFieldAtIndex(idx))
    302             return fields
    303 
    304         def get_members_array(self):
    305             '''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.'''
    306             members = []
    307             bases = self.get_bases_array()
    308             fields = self.get_fields_array()
    309             vbases = self.get_vbases_array()
    310             for base in bases:
    311                 bit_offset = base.bit_offset
    312                 added = False
    313                 for idx, member in enumerate(members):
    314                     if member.bit_offset > bit_offset:
    315                         members.insert(idx, base)
    316                         added = True
    317                         break
    318                 if not added:
    319                     members.append(base)
    320             for vbase in vbases:
    321                 bit_offset = vbase.bit_offset
    322                 added = False
    323                 for idx, member in enumerate(members):
    324                     if member.bit_offset > bit_offset:
    325                         members.insert(idx, vbase)
    326                         added = True
    327                         break
    328                 if not added:
    329                     members.append(vbase)
    330             for field in fields:
    331                 bit_offset = field.bit_offset
    332                 added = False
    333                 for idx, member in enumerate(members):
    334                     if member.bit_offset > bit_offset:
    335                         members.insert(idx, field)
    336                         added = True
    337                         break
    338                 if not added:
    339                     members.append(field)
    340             return members
    341 
    342         __swig_getmethods__["bases"] = get_bases_array
    343         if _newclass: 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.''')
    344 
    345         __swig_getmethods__["vbases"] = get_vbases_array
    346         if _newclass: 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.''')
    347 
    348         __swig_getmethods__["fields"] = get_fields_array
    349         if _newclass: 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.''')
    350 
    351         __swig_getmethods__["members"] = get_members_array
    352         if _newclass: 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.''')
    353 
    354         %}
    355 
    356 };
    357 
    358 %feature("docstring",
    359 "Represents a list of SBTypes.  The FindTypes() method of SBTarget/SBModule
    360 returns a SBTypeList.
    361 
    362 SBTypeList supports SBType iteration. For example,
    363 
    364 main.cpp:
    365 
    366 class Task {
    367 public:
    368     int id;
    369     Task *next;
    370     Task(int i, Task *n):
    371         id(i),
    372         next(n)
    373     {}
    374 };
    375 
    376 ...
    377 
    378 find_type.py:
    379 
    380         # Get the type 'Task'.
    381         type_list = target.FindTypes('Task')
    382         self.assertTrue(len(type_list) == 1)
    383         # To illustrate the SBType iteration.
    384         for type in type_list:
    385             # do something with type
    386 
    387 ...
    388 ") SBTypeList;
    389 class SBTypeList
    390 {
    391 public:
    392     SBTypeList();
    393 
    394     bool
    395     IsValid();
    396 
    397     void
    398     Append (lldb::SBType type);
    399 
    400     lldb::SBType
    401     GetTypeAtIndex (uint32_t index);
    402 
    403     uint32_t
    404     GetSize();
    405 
    406     ~SBTypeList();
    407 };
    408 
    409 } // namespace lldb
    410