diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py index b9c8580a79f9fc269d64cb1e18fdb7af2c5df8a8..380189c75b690fe8cee3bdee15bc6265364fbbd5 100644 --- a/share/qtcreator/gdbmacros/dumper.py +++ b/share/qtcreator/gdbmacros/dumper.py @@ -264,7 +264,7 @@ def encodeString(value): ####################################################################### class Item: - def __init__(self, value, parentiname, iname, name): + def __init__(self, value, parentiname, iname, name = None): self.value = value if iname is None: self.iname = parentiname @@ -463,6 +463,8 @@ class Dumper: self.safeoutput = "" self.childTypes = [""] self.childNumChilds = [-1] + self.maxNumChilds = [-1] + self.numChilds = [-1] def put(self, value): self.output += value @@ -493,35 +495,50 @@ class Dumper: def endItem(self): self.put('"') - def beginChildren(self, numChild = 1, type = None, children = None): + def beginChildren(self, numChild_ = 1, childType_ = None, childNumChild_ = None): childType = "" childNumChild = -1 + if type(numChild_) is list: + numChild = numChild_[0] + maxNumChild = numChild_[1] + else: + numChild = numChild_ + maxNumChild = numChild_ if numChild == 0: - type = None + childType_ = None self.putCommaIfNeeded() - if not type is None: - childType = stripClassTag(str(type)) + if not childType_ is None: + childType = stripClassTag(str(childType_)) self.put('childtype="%s",' % childType) - if isSimpleType(type) or isStringType(self, type): + if isSimpleType(childType_) or isStringType(self, childType_): self.put('childnumchild="0",') childNumChild = 0 - elif type.code == gdb.TYPE_CODE_PTR: + elif childType_.code == gdb.TYPE_CODE_PTR: self.put('childnumchild="1",') childNumChild = 1 - if not children is None: - self.put('childnumchild="%s",' % children) - childNumChild = children + if not childNumChild_ is None: + self.put('childnumchild="%s",' % childNumChild_) + childNumChild = childNumChild_ self.childTypes.append(childType) self.childNumChilds.append(childNumChild) + self.numChilds.append(numChild) + self.maxNumChilds.append(maxNumChild) #warn("BEGIN: %s" % self.childTypes) self.put("children=[") def endChildren(self): #warn("END: %s" % self.childTypes) + numChild = self.numChilds.pop() + maxNumChild = self.maxNumChilds.pop() + if maxNumChild < numChild: + self.putEllipsis(); self.childTypes.pop() self.childNumChilds.pop() self.put(']') + def childRange(self): + return xrange(qmin(self.maxNumChilds[-1], self.numChilds[-1])) + # convenience def putItemCount(self, count): self.putCommaIfNeeded() diff --git a/share/qtcreator/gdbmacros/gdbmacros.py b/share/qtcreator/gdbmacros/gdbmacros.py index d7099a68c7119af9e1b574db6e7673f76f65ffa0..0120da9299a61d1c96ae39a9e1a2eb7d786e1a81 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.py +++ b/share/qtcreator/gdbmacros/gdbmacros.py @@ -15,16 +15,13 @@ def qdump__QByteArray(d, item): d.putNumChild(size) if d.isExpanded(item): - n = qmin(size, 1000) innerType = gdb.lookup_type("char") data = d_ptr['data'] - d.beginChildren(n, innerType) + d.beginChildren([size, 1000], innerType) p = gdb.Value(data.cast(innerType.pointer())) - for i in xrange(n): - d.putItem(Item(p.dereference(), item.iname, i, None)) + for i in d.childRange(): + d.putItem(Item(p.dereference(), item.iname, i)) p += 1 - if n < size: - d.putEllipsis() d.endChildren() @@ -257,38 +254,35 @@ def qdump__QHash(d, item): d_ptr = item.value["d"] e_ptr = item.value["e"] - n = d_ptr["size"] + size = d_ptr["size"] hashDataType = d_ptr.type hashNodeType = e_ptr.type - check(0 <= n and n <= 100 * 1000 * 1000) + check(0 <= size and size <= 100 * 1000 * 1000) check(d_ptr["ref"]["_q_value"] > 0) - d.putItemCount(n) - d.putNumChild(n) + d.putItemCount(size) + d.putNumChild(size) if d.isExpanded(item): - if n > 1000: - n = 1000 - isSimpleKey = isSimpleType(keyType) isSimpleValue = isSimpleType(valueType) node = hashDataFirstNode(item.value) innerType = e_ptr.dereference().type inner = select(isSimpleKey and isSimpleValue, valueType, innerType) - d.beginChildren(n, inner) - for i in xrange(n): + d.beginChildren([size, 1000], inner) + for i in d.childRange(): it = node.dereference().cast(innerType) d.beginHash() key = it["key"] value = it["value"] if isSimpleKey and isSimpleValue: d.putName(key) - d.putItemHelper(Item(value, item.iname, i, None)) + d.putItemHelper(Item(value, item.iname, i)) d.putType(valueType) else: - d.putItemHelper(Item(it, item.iname, i, None)) + d.putItemHelper(Item(it, item.iname, i)) d.endHash() node = hashDataNextNode(node) d.endChildren() @@ -310,11 +304,11 @@ def qdump__QHashNode(d, item): d.beginChildren() d.beginHash() d.putName("key") - d.putItemHelper(Item(key, None, None, None)) + d.putItemHelper(Item(key, None, None)) d.endHash() d.beginHash() d.putName("value") - d.putItemHelper(Item(value, None, None, None)) + d.putItemHelper(Item(value, None, None)) d.endHash() d.endChildren() @@ -325,8 +319,8 @@ def qdump__QList(d, item): end = d_ptr["end"] array = d_ptr["array"] check(begin >= 0 and end >= 0 and end <= 1000 * 1000 * 1000) - n = end - begin - check(n >= 0) + size = end - begin + check(size >= 0) #if n > 0: # checkAccess(&list.front()) # checkAccess(&list.back()) @@ -339,15 +333,11 @@ def qdump__QList(d, item): and str(innerType.target().unqualified()) != "char" if innerTypeIsPointer: p = gdb.Value(array).cast(innerType.pointer()) + begin - checkPointerRange(p, qmin(n, 100)) + checkPointerRange(p, qmin(size, 100)) - d.putItemCount(n) - d.putNumChild(n) + d.putItemCount(size) + d.putNumChild(size) if d.isExpanded(item): - # about 0.5s / 1000 items - if n > 2000: - n = 2000 - innerSize = innerType.sizeof # The exact condition here is: # QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic @@ -362,17 +352,15 @@ def qdump__QList(d, item): inner = innerType.target() else: inner = innerType - d.beginChildren(n, inner) - for i in xrange(n): + # about 0.5s / 1000 items + d.beginChildren([size, 2000], inner) + for i in d.childRange(): if isInternal: - d.putItem(Item(p.dereference(), item.iname, i, None)) + d.putItem(Item(p.dereference(), item.iname, i)) else: pp = p.cast(innerType.pointer().pointer()).dereference() - d.putItem(Item(pp.dereference(), item.iname, i, None)) + d.putItem(Item(pp.dereference(), item.iname, i)) p += 1 - - if n < end - begin: - d.putEllipsis() d.endChildren() @@ -405,25 +393,17 @@ def qdump__QImage(d, item): def qdump__QLinkedList(d, item): d_ptr = item.value["d"] e_ptr = item.value["e"] - nn = d_ptr["size"] - n = nn + n = d_ptr["size"] check(0 <= n and n <= 100*1000*1000) check(d_ptr["ref"]["_q_value"] > 0) - d.putItemCount(n) d.putNumChild(n) - if d.isExpanded(item): - innerType = item.value.type.template_argument(0) - if n > 1000: - n = 1000 - d.beginChildren(n, innerType) + d.beginChildren([n, 1000], item.value.type.template_argument(0)) p = e_ptr["n"] - for i in xrange(n): - d.safePutItem(Item(p["t"], None, None, None)) + for i in d.childRange(): + d.safePutItem(Item(p["t"], None, None)) p = p["n"] - if n < nn: - d.putEllipsis() d.endChildren() @@ -456,11 +436,11 @@ def qdump__QMapNode(d, item): d.beginChildren(2) d.beginHash() d.putName("key") - d.putItemHelper(Item(item.value["key"], item.iname, "name", None)) + d.putItemHelper(Item(item.value["key"], item.iname, "name")) d.endHash() d.beginHash() d.putName("value") - d.putItemHelper(Item(item.value["value"], item.iname, "value", None)) + d.putItemHelper(Item(item.value["value"], item.iname, "value")) d.endHash() d.endChildren() @@ -508,9 +488,9 @@ def qdump__QMap(d, item): if isSimpleKey and isSimpleValue: #d.putType(valueType) d.putName(key) - d.putItemHelper(Item(value, item.iname, i, None)) + d.putItemHelper(Item(value, item.iname, i)) else: - d.putItemHelper(Item(node, item.iname, i, None)) + d.putItemHelper(Item(node, item.iname, i)) d.endHash() it = it.dereference()["forward"].dereference() d.endChildren() @@ -622,7 +602,7 @@ def qdump__QObject(d, item): data = value["d"]["data"]["ptr"] innerType = gdb.lookup_type(d.ns + "QString") d.putItemHelper( - Item(data.cast(innerType), item.iname, property, None)) + Item(data.cast(innerType), item.iname, property)) #d.putNumChild(0) else: iname = "%s.properties.%s" % (item.iname, propertyName) @@ -1393,35 +1373,30 @@ def qdump__QSet(d, item): d_ptr = item.value["q_hash"]["d"] e_ptr = item.value["q_hash"]["e"] - n = d_ptr["size"] + size = d_ptr["size"] hashDataType = d_ptr.type hashNodeType = e_ptr.type - check(0 <= n and n <= 100 * 1000 * 1000) + check(0 <= size and size <= 100 * 1000 * 1000) check(d_ptr["ref"]["_q_value"] > 0) - d.putItemCount(n) - d.putNumChild(n) + d.putItemCount(size) + d.putNumChild(size) if d.isExpanded(item): - if n > 1000: - n = 1000 - isSimpleKey = isSimpleType(keyType) - node = hashDataFirstNode(item.value) - innerType = e_ptr.dereference().type - d.beginChildren(n, keyType) - for i in xrange(n): + d.beginChildren([size, 1000], keyType) + for i in xrange(size): it = node.dereference().cast(innerType) d.beginHash() key = it["key"] if isSimpleKey: d.putType(keyType) - d.putItemHelper(Item(key, None, None, None)) + d.putItemHelper(Item(key, None, None)) else: - d.putItemHelper(Item(key, item.iname, i, None)) + d.putItemHelper(Item(key, item.iname, i)) d.endHash() node = hashDataNextNode(node) d.endChildren() @@ -1460,25 +1435,21 @@ def qdump__QStringList(d, item): d_ptr = item.value['d'] begin = d_ptr['begin'] end = d_ptr['end'] - n = end - begin - check(n >= 0) - check(n <= 10 * 1000 * 1000) + size = end - begin + check(size >= 0) + check(size <= 10 * 1000 * 1000) # checkAccess(&list.front()) # checkAccess(&list.back()) check(d_ptr["ref"]["_q_value"] > 0) - d.putItemCount(n) - d.putNumChild(n) + d.putItemCount(size) + d.putNumChild(size) if d.isExpanded(item): - if n > 1000: - n = 1000 innerType = gdb.lookup_type(d.ns + "QString") ptr = gdb.Value(d_ptr["array"]).cast(innerType.pointer()) - d.beginChildren(n, innerType) - for i in xrange(n): - d.putItem(Item(ptr.dereference(), item.iname, i, None)) + d.beginChildren([size, 1000], innerType) + for i in d.childRange(): + d.putItem(Item(ptr.dereference(), item.iname, i)) ptr += 1 - if n < end - begin: - d.putEllipsis() d.endChildren() @@ -1642,11 +1613,6 @@ def qdump__QVariant(d, item): def qdump__QVector(d, item): - # QBasicAtomicInt ref; - # int alloc; - # int size; - # uint sharable : 1; - # uint capacity : 1; d_ptr = item.value["d"] p_ptr = item.value["p"] alloc = d_ptr["alloc"] @@ -1655,26 +1621,15 @@ def qdump__QVector(d, item): check(0 <= size and size <= alloc and alloc <= 1000 * 1000 * 1000) check(d_ptr["ref"]["_q_value"] > 0) - # Check pointers innerType = item.value.type.template_argument(0) - #if innerType.code == gdb.TYPE_CODE_PTR and nn > 0: - # for (int i = 0; i != size; ++i) - # if const void *p = addOffset(v, i * innersize + typeddatasize)) - # checkAccess(deref(p)) - d.putItemCount(size) d.putNumChild(size) if d.isExpanded(item): - n = size - if n > 10000: - n = 10000 p = gdb.Value(p_ptr["array"]).cast(innerType.pointer()) - d.beginChildren(n, innerType) - for i in xrange(n): - d.safePutItem(Item(p.dereference(), item.iname, i, None)) + d.beginChildren([size, 2000], innerType) + for i in d.childRange(): + d.safePutItem(Item(p.dereference(), item.iname, i)) p += 1 - if n < size: - d.putEllipsis() d.endChildren() @@ -1697,7 +1652,7 @@ def qdump__QWeakPointer(d, item): innerType = item.value.type.template_argument(0) if isSimpleType(value.dereference()): - d.putItemHelper(Item(value.dereference(), item.iname, None, None)) + d.putItemHelper(Item(value.dereference(), item.iname, None)) else: d.putValue("") @@ -1720,20 +1675,20 @@ def qdump__QWeakPointer(d, item): def qdump__std__deque(d, item): impl = item.value["_M_impl"] start = impl["_M_start"] - n = impl["_M_finish"]["_M_cur"] - start["_M_cur"] - d.putItemCount(n) - d.putNumChild(n) + size = impl["_M_finish"]["_M_cur"] - start["_M_cur"] + d.putItemCount(size) + d.putNumChild(size) if d.isExpanded(item): innerType = item.value.type.template_argument(0) innerSize = innerType.sizeof bufsize = select(innerSize < 512, 512 / innerSize, 1) - d.beginChildren(n, innerType) + d.beginChildren([size, 2000], innerType) pcur = start["_M_cur"] pfirst = start["_M_first"] plast = start["_M_last"] pnode = start["_M_node"] - for i in xrange(n): - d.safePutItem(Item(pcur.dereference(), item.iname, i, None)) + for i in d.childRange(): + d.safePutItem(Item(pcur.dereference(), item.iname, i)) pcur += 1 if pcur == plast: newnode = pnode + 1 @@ -1741,9 +1696,6 @@ def qdump__std__deque(d, item): pfirst = newnode.dereference() plast = pfirst + bufsize pcur = pfirst - - if n > 1000: - d.putEllipsis() d.endChildren() @@ -1751,35 +1703,33 @@ def qdump__std__list(d, item): impl = item.value["_M_impl"] node = impl["_M_node"] head = node.address - n = 0 + size = 0 p = node["_M_next"] - while p != head and n <= 1001: - n += 1 + while p != head and size <= 1001: + size += 1 p = p["_M_next"] - d.putItemCount(select(n <= 1000, n, "> 1000")) - d.putNumChild(n) + d.putItemCount(select(size <= 1000, size, "> 1000")) + d.putNumChild(size) if d.isExpanded(item): p = node["_M_next"] innerType = item.value.type.template_argument(0) - d.beginChildren(n, innerType) - for i in xrange(n): + d.beginChildren([size, 1000], innerType) + for i in d.childRange(): innerPointer = innerType.pointer() value = (p + 1).cast(innerPointer).dereference() - d.safePutItem(Item(value, item.iname, i, None)) + d.safePutItem(Item(value, item.iname, i)) p = p["_M_next"] - if n > 1000: - d.putEllipsis() d.endChildren() def qdump__std__map(d, item): impl = item.value["_M_t"]["_M_impl"] - n = impl["_M_node_count"] - check(0 <= n and n <= 100*1000*1000) - d.putItemCount(n) - d.putNumChild(n) + size = impl["_M_node_count"] + check(0 <= size and size <= 100*1000*1000) + d.putItemCount(size) + d.putNumChild(size) if d.isExpanded(item): keyType = item.value.type.template_argument(0) @@ -1790,15 +1740,15 @@ def qdump__std__map(d, item): innerType = select(isSimpleKey and isSimpleValue, valueType, pairType) pairPointer = pairType.pointer() node = impl["_M_header"]["_M_left"] - d.beginChildren(n, select(n > 0, innerType, pairType), + d.beginChildren([size, 1000], select(size > 0, innerType, pairType), select(isSimpleKey and isSimpleValue, None, 2)) - for i in xrange(qmin(n, 1000)): + for i in d.childRange(): pair = (node + 1).cast(pairPointer).dereference() d.beginHash() if isSimpleKey and isSimpleValue: d.putName(str(pair["first"])) - d.putItemHelper(Item(pair["second"], item.iname, i, None)) + d.putItemHelper(Item(pair["second"], item.iname, i)) else: d.putValue(" ") if d.isExpandedIName("%s.%d" % (item.iname, i)): @@ -1822,25 +1772,22 @@ def qdump__std__map(d, item): node = node["_M_right"] while not isNull(node["_M_left"]): node = node["_M_left"] - - if n >= 1000: - d.putEllipsis() d.endChildren() def qdump__std__set(d, item): impl = item.value["_M_t"]["_M_impl"] - n = impl["_M_node_count"] - check(0 <= n and n <= 100*1000*1000) - d.putItemCount(n) - d.putNumChild(n) + size = impl["_M_node_count"] + check(0 <= size and size <= 100*1000*1000) + d.putItemCount(size) + d.putNumChild(size) if d.isExpanded(item): valueType = item.value.type.template_argument(0) node = impl["_M_header"]["_M_left"] - d.beginChildren(n, valueType) - for i in xrange(qmin(n, 1000)): + d.beginChildren([size, 1000], valueType) + for i in d.childRange(): element = (node + 1).cast(valueType.pointer()).dereference() - d.putItem(Item(element, item.iname, i, None)) + d.putItem(Item(element, item.iname, i)) if isNull(node["_M_right"]): parent = node["_M_parent"] @@ -1853,8 +1800,6 @@ def qdump__std__set(d, item): node = node["_M_right"] while not isNull(node["_M_left"]): node = node["_M_left"] - if n >= 1000: - d.putEllipsis() d.endChildren() @@ -1902,15 +1847,11 @@ def qdump__std__vector(d, item): d.putItemCount(size) d.putNumChild(size) if d.isExpanded(item): - n = qmin(size, 10000) p = start - innerType = item.value.type.template_argument(0) - d.beginChildren(n, innerType) - for i in xrange(n): - d.safePutItem(Item(p.dereference(), item.iname, i, None)) + d.beginChildren([size, 10000], item.value.type.template_argument(0)) + for i in d.childRange(): + d.safePutItem(Item(p.dereference(), item.iname, i)) p += 1 - if n < size: - d.putEllipsis() d.endChildren()