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)]
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()