diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py index 53a437b2130d5a44339ceb8fa2743c76bb55bfb6..e31b15471c7e15163e9cbbc9ac53a503b8548092 100644 --- a/share/qtcreator/gdbmacros/dumper.py +++ b/share/qtcreator/gdbmacros/dumper.py @@ -752,7 +752,7 @@ def encodeString(value): ####################################################################### class Item: - def __init__(self, value, parentiname, iname, name = None): + def __init__(self, value, parentiname, iname = None, name = None): self.value = value if iname is None: self.iname = parentiname @@ -1366,52 +1366,57 @@ class Dumper: if len(fields) == 1 and fields[0].name is None: innerType = value.type.target() with Children(self, 1, innerType): + self.putFields(item) + + def putFields(self, item, innerType = None): + value = item.value + fields = value.type.strip_typedefs().fields() + baseNumber = 0 + for field in fields: + #warn("FIELD: %s" % field) + #warn(" BITSIZE: %s" % field.bitsize) + #warn(" ARTIFICIAL: %s" % field.artificial) + bitpos = getattr(field, "bitpos", None) + if bitpos is None: # FIXME: Is check correct? + continue # A static class member(?). + + if field.name is None: + innerType = value.type.target() + p = value.cast(innerType.pointer()) + for i in xrange(value.type.sizeof / innerType.sizeof): + self.putItem(Item(p.dereference(), item.iname, i, None)) + p = p + 1 + continue + + # Ignore vtable pointers for virtual inheritance. + if field.name.startswith("_vptr."): + continue + + #warn("FIELD NAME: %s" % field.name) + #warn("FIELD TYPE: %s" % field.type) + if field.name == stripClassTag(str(field.type)): + # Field is base type. We cannot use field.name as part + # of the iname as it might contain spaces and other + # strange characters. + child = Item(value.cast(field.type), + item.iname, "@%d" % baseNumber, field.name) + baseNumber += 1 + with SubItem(self): + self.putField("iname", child.iname) + self.putItemHelper(child) + elif len(field.name) == 0: + # Anonymous union. We need a dummy name to distinguish + # multiple anonymous unions in the struct. + self.anonNumber += 1 + self.listAnonymous(item, "#%d" % self.anonNumber, + field.type) + else: + # Named field. + with SubItem(self): + child = Item(value[field.name], + item.iname, field.name, field.name) + self.putItemHelper(child) - baseNumber = 0 - for field in fields: - #warn("FIELD: %s" % field) - #warn(" BITSIZE: %s" % field.bitsize) - #warn(" ARTIFICIAL: %s" % field.artificial) - bitpos = getattr(field, "bitpos", None) - if bitpos is None: # FIXME: Is check correct? - continue # A static class member(?). - - if field.name is None: - innerType = value.type.target() - p = value.cast(innerType.pointer()) - for i in xrange(value.type.sizeof / innerType.sizeof): - self.putItem(Item(p.dereference(), item.iname, i, None)) - p = p + 1 - continue - - # Ignore vtable pointers for virtual inheritance. - if field.name.startswith("_vptr."): - continue - - #warn("FIELD NAME: %s" % field.name) - #warn("FIELD TYPE: %s" % field.type) - if field.name == stripClassTag(str(field.type)): - # Field is base type. We cannot use field.name as part - # of the iname as it might contain spaces and other - # strange characters. - child = Item(value.cast(field.type), - item.iname, "@%d" % baseNumber, field.name) - baseNumber += 1 - with SubItem(self): - self.putField("iname", child.iname) - self.putItemHelper(child) - elif len(field.name) == 0: - # Anonymous union. We need a dummy name to distinguish - # multiple anonymous unions in the struct. - self.anonNumber += 1 - self.listAnonymous(item, "#%d" % self.anonNumber, - field.type) - else: - # Named field. - with SubItem(self): - child = Item(value[field.name], - item.iname, field.name, field.name) - self.putItemHelper(child) def listAnonymous(self, item, name, type): for field in type.fields(): diff --git a/share/qtcreator/gdbmacros/gdbmacros.py b/share/qtcreator/gdbmacros/gdbmacros.py index 6aa0e995de2a06f69312d13d06076b6c9441e14a..ea2521c6e31b2c7a6f6447ab32e7f473612f1bc5 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.py +++ b/share/qtcreator/gdbmacros/gdbmacros.py @@ -1440,13 +1440,14 @@ def qdump__QTextCodec(d, item): d.putCallItem("name", item, "name()") d.putCallItem("mibEnum", item, "mibEnum()") + def qdump__QUrl(d, item): - d_ptr = item.value["d"].dereference() - d.putStringValue(d_ptr["encodedOriginal"]) + data = item.value["d"].dereference() + d.putStringValue(data["encodedOriginal"]) d.putNumChild(1) if d.isExpanded(item): with Children(d): - d.putItem(Item(d_ptr, item.iname, "d", "d")) + d.putFields(Item(data, item.iname)) def qdumpHelper__QVariant(d, value):