diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py index 7ccdec0fc3d822ddfa3614c4627abcfc0158c81f..33acc9297b5ea7314d04fe4896a8c9819eb57c0f 100644 --- a/share/qtcreator/gdbmacros/dumper.py +++ b/share/qtcreator/gdbmacros/dumper.py @@ -1419,63 +1419,71 @@ class Dumper: else: qqDumpers[nsStrippedType](self, item) #warn(" RESULT: %s " % self.output) + return - elif typedefStrippedType.code == gdb.TYPE_CODE_PTR: + if typedefStrippedType.code == gdb.TYPE_CODE_PTR: #warn("POINTER: %s" % format) - isHandled = False target = stripTypedefs(type.target()) - if (not isHandled) and isNull(value): + if isNull(value): #warn("NULL POINTER") self.putType(item.value.type) self.putValue("0x0") self.putNumChild(0) - isHandled = True + return - if (not isHandled) and target.code == gdb.TYPE_CODE_VOID: + if target.code == gdb.TYPE_CODE_VOID: #warn("VOID POINTER: %s" % format) self.putType(item.value.type) self.putValue(str(value)) self.putNumChild(0) - isHandled = True + return - if (not isHandled) and (not format is None): - #warn("SPECIAL FORMAT POINTER: %s" % format) + if format == 0: + # Explicitly requested bald pointer. self.putAddress(value.address) self.putType(item.value.type) - isHandled = True - if format == 0: - # Bald pointer. - self.putPointerValue(value.address) - self.putNumChild(1) - elif format == 1 or format == 2: - # Latin1 or UTF-8 - f = select(format == 1, Hex2EncodedLatin1, Hex2EncodedUtf8) - self.putValue(encodeCharArray(value, 100), f) - self.putNumChild(0) - elif format == 3: - # UTF-16. - self.putValue(encodeChar2Array(value, 100), Hex4EncodedBigEndian) - self.putNumChild(0) - elif format == 4: - # UCS-4: - self.putValue(encodeChar4Array(value, 100), Hex8EncodedBigEndian) - self.putNumChild(0) + self.putPointerValue(value.address) + self.putNumChild(1) + return - if (not isHandled) and (str(typedefStrippedType) + if format == 1 or format == 2: + # Explicityly requested Latin1 or UTF-8 formatting. + f = select(format == 1, Hex2EncodedLatin1, Hex2EncodedUtf8) + self.putAddress(value.address) + self.putType(item.value.type) + self.putValue(encodeCharArray(value, 100), f) + self.putNumChild(0) + return + + if format == 3: + # Explitly requested UTF-16 formatting. + self.putAddress(value.address) + self.putType(item.value.type) + self.putValue(encodeChar2Array(value, 100), Hex4EncodedBigEndian) + self.putNumChild(0) + return + + if format == 4: + # Explitly requested UCS-4 formatting. + self.putAddress(value.address) + self.putType(item.value.type) + self.putValue(encodeChar4Array(value, 100), Hex8EncodedBigEndian) + self.putNumChild(0) + return + + if (str(typedefStrippedType) .replace("(anonymous namespace)", "").find("(") != -1): - # A function pointer. - self.putValue(str(item.value)) - self.putAddress(value.address) - self.putType(item.value.type) - self.putNumChild(0) - isHandled = True + # A function pointer with format None. + self.putValue(str(item.value)) + self.putAddress(value.address) + self.putType(item.value.type) + self.putNumChild(0) + return #warn("AUTODEREF: %s" % self.autoDerefPointers) - #warn("IS HANDLED: %s" % isHandled) - #warn("RES: %s" % (self.autoDerefPointers and not isHandled)) - if (not isHandled) and (self.autoDerefPointers or name == "this"): - ## Generic pointer type. + if self.autoDerefPointers or name == "this": + ## Generic pointer type with format None #warn("GENERIC AUTODEREF POINTER: %s" % value.address) innerType = item.value.type.target() self.putType(innerType) @@ -1485,23 +1493,23 @@ class Dumper: Item(item.value.dereference(), item.iname, None, None)) self.currentChildType = savedCurrentChildType self.putPointerValue(value.address) - isHandled = True + return # Fall back to plain pointer printing. - if not isHandled: - #warn("GENERIC PLAIN POINTER: %s" % value.type) - self.putType(item.value.type) - self.putAddress(value.address) - self.putNumChild(1) - if self.isExpanded(item): - with Children(self): - with SubItem(self): - self.putItemHelper(Item(item.value.dereference(), - item.iname, "*", "*")) - self.putAddress(item.value) - self.putPointerValue(value.address) + #warn("GENERIC PLAIN POINTER: %s" % value.type) + self.putType(item.value.type) + self.putAddress(value.address) + self.putNumChild(1) + if self.isExpanded(item): + with Children(self): + with SubItem(self): + self.putItemHelper(Item(item.value.dereference(), + item.iname, "*", "*")) + self.putAddress(item.value) + self.putPointerValue(value.address) + return - elif str(typedefStrippedType).startswith("<anon"): + if str(typedefStrippedType).startswith("<anon"): # Anonymous union. We need a dummy name to distinguish # multiple anonymous unions in the struct. self.putType(item.value.type) @@ -1509,46 +1517,46 @@ class Dumper: self.anonNumber += 1 with Children(self, 1): self.listAnonymous(item, "#%d" % self.anonNumber, type) + return - else: - #warn("GENERIC STRUCT: %s" % item.value.type) - #warn("INAME: %s " % item.iname) - #warn("INAMES: %s " % self.expandedINames) - #warn("EXPANDED: %s " % (item.iname in self.expandedINames)) - fields = extractFields(type) + #warn("GENERIC STRUCT: %s" % item.value.type) + #warn("INAME: %s " % item.iname) + #warn("INAMES: %s " % self.expandedINames) + #warn("EXPANDED: %s " % (item.iname in self.expandedINames)) + fields = extractFields(type) - self.putType(item.value.type) - try: - self.putAddress(item.value.address) - except: - pass - self.putValue("{...}") - - if False: - numfields = 0 - for field in fields: - bitpos = getattr(field, "bitpos", None) - if not bitpos is None: - ++numfields - else: - numfields = len(fields) - self.putNumChild(numfields) + self.putType(item.value.type) + try: + self.putAddress(item.value.address) + except: + pass + self.putValue("{...}") - if self.isExpanded(item): - if value.type.code == gdb.TYPE_CODE_ARRAY: - baseptr = value.cast(value.type.target().pointer()) - charptr = lookupType("unsigned char").pointer() - addr1 = (baseptr+1).cast(charptr) - addr0 = baseptr.cast(charptr) - self.put('addrbase="%s",' % cleanAddress(addr0)) - self.put('addrstep="%s",' % (addr1 - addr0)) - - innerType = None - if len(fields) == 1 and fields[0].name is None: - innerType = value.type.target() - with Children(self, 1, innerType): - child = Item(value, item.iname, None, item.name) - self.putFields(child) + if False: + numfields = 0 + for field in fields: + bitpos = getattr(field, "bitpos", None) + if not bitpos is None: + ++numfields + else: + numfields = len(fields) + self.putNumChild(numfields) + + if self.isExpanded(item): + if value.type.code == gdb.TYPE_CODE_ARRAY: + baseptr = value.cast(value.type.target().pointer()) + charptr = lookupType("unsigned char").pointer() + addr1 = (baseptr+1).cast(charptr) + addr0 = baseptr.cast(charptr) + self.put('addrbase="%s",' % cleanAddress(addr0)) + self.put('addrstep="%s",' % (addr1 - addr0)) + + innerType = None + if len(fields) == 1 and fields[0].name is None: + innerType = value.type.target() + with Children(self, 1, innerType): + child = Item(value, item.iname, None, item.name) + self.putFields(child) def putFields(self, item, innerType = None): value = item.value