Example #1
0
    def children(self):
        d = self.val['d']
        typ = int(d['type'])
        if typ == typeinfo.meta_type_unknown:
            return [('type', 'invalid')]

        data = d['data']

        if typ in typeinfo.meta_type_names:
            typename = typeinfo.meta_type_names[typ]
            if typename in self._varmap:
                field = self._varmap[typename]
                return [('type', typename), ('data', data[field])]

            try:
                if typename.endswith('*'):
                    gdb_type = gdb.lookup_type(typename[0:-1]).pointer()
                else:
                    gdb_type = gdb.lookup_type(typename)
            except gdb.error:
                # couldn't find any type information
                return [('type', typename), ('data', data)]

            if gdb_type.sizeof > data.type.sizeof:
                is_pointer = True
            elif (typeinfo.type_is_known_movable(gdb_type) or
                    typeinfo.type_is_known_primitive(gdb_type)):
                is_pointer = False
            elif gdb_type.tag == 'enum':
                is_pointer = False
            else:
                # couldn't figure out how the type is stored
                return [('type', typename), ('data', data)]

            if is_pointer:
                value = data['shared']['ptr'].reinterpret_cast(gdb_type.pointer())
            else:
                void_star = gdb.lookup_type('void').pointer()
                data_void = data['c'].address.reinterpret_cast(void_star)
                value = data_void.reinterpret_cast(gdb_type.pointer())

            return [('type', typename), ('data', value.referenced_value())]
        else:
            # custom type?
            return [('type', typ), ('data', data)]
Example #2
0
        def __init__(self, array, begin, end, typ):
            self.array = array
            self.end = end
            self.begin = begin
            self.offset = 0
            if typ.name == 'QStringList':
                self.el_type = gdb.lookup_type('QString')
            else:
                self.el_type = typ.template_argument(0)

            if ((self.el_type.sizeof > gdb.lookup_type('void').pointer().sizeof)
                    or typeinfo.type_is_known_static(self.el_type)):
                self.is_pointer = True
            elif (typeinfo.type_is_known_movable(self.el_type) or
                    typeinfo.type_is_known_primitive(self.el_type)):
                self.is_pointer = False
            else:
                raise ValueError("Could not determine whether QList stores " +
                        self.el_type.name + " directly or as a pointer: to fix " +
                        "this, add it to one of the variables in the "+
                        "qt5printers.typeinfo module")
            self.node_type = gdb.lookup_type(typ.name + '::Node').pointer()