diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py index b1336efb02c78150d286ba59d1e96930be3cc5e2..53a437b2130d5a44339ceb8fa2743c76bb55bfb6 100644 --- a/share/qtcreator/gdbmacros/dumper.py +++ b/share/qtcreator/gdbmacros/dumper.py @@ -607,6 +607,28 @@ def call(value, func): #warn(" -> %s" % result) return result +def makeValue(type, init): + type = stripClassTag(type) + if type.find(":") >= 0: + type = "'" + type + "'" + gdb.execute("set $d = (%s*)malloc(sizeof(%s))" % (type, type)) + gdb.execute("set *$d = {%s}" % init) + value = parseAndEvaluate("$d").dereference() + #warn(" TYPE: %s" % value.type) + #warn(" ADDR: %s" % value.address) + #warn(" VALUE: %s" % value) + return value + +def makeExpression(value): + type = stripClassTag(str(value.type)) + if type.find(":") >= 0: + type = "'" + type + "'" + #warn(" TYPE: %s" % type) + #exp = "(*(%s*)(&%s))" % (type, value.address) + exp = "(*(%s*)(%s))" % (type, value.address) + #warn(" EXP: %s" % exp) + return exp + def qtNamespace(): try: type = str(parseAndEvaluate("&QString::null").type.target().unqualified()) diff --git a/share/qtcreator/gdbmacros/gdbmacros.py b/share/qtcreator/gdbmacros/gdbmacros.py index 2ca413c4b855aad954efbad2ba40f458cb468cad..605c6187b9149ae344bd2cdba22f40fbba1e3ee9 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.py +++ b/share/qtcreator/gdbmacros/gdbmacros.py @@ -68,46 +68,95 @@ def qdump__QAbstractItem(d, item): d.putNumChild(rr * cc) d.putField("value", call(m, "data(child, Qt::DisplayRole).toString())"), 6) + #with SubItem(d): - # d.putName("DisplayRole") - # d.putNumChild(0) - # d.putValue(m->data(mi, Qt::DisplayRole).toString(), 2) - # d.putField("type", ns + "QString") - - -#def qdump__QAbstractItemModel(d, item): -# # Create a default-constructed QModelIndex on the stack. -# dummy = "(('%sQModelIndex'*)($sp-100))" % d.ns -# gdb.execute("set variable %s->m=0" % dummy) -# gdb.execute("set variable %s->p=0" % dummy) -# gdb.execute("set variable %s->r=-1" % dummy) -# gdb.execute("set variable %s->c=-1" % dummy) -# value = parseAndEvaluate("%s->m" % dummy) -# rowCount = call(item.value, "rowCount(*%s)" % dummy) -# columnCount = call(item.value, "columnCount(*%s)" % dummy) -# d.putValue("(%s,%s)" % (rowCount, columnCount)) -# d.putNumChild(1) -# if d.isExpanded(item): -# with Children(d, 1 + rowCount * columnCount): -# with SubItem(d): - # d.putNumChild(1) - # d.putName(d.ns + "QObject") - # d.putStringValue(call(item.value, "objectName()")) - # d.putType(d.ns + "QObject") - # d.put('addr="%s",' % cleanAddress(item.value.address)) -# #d.putField("displayedtype", call(item, "m.metaObject()->className()")) -# gdb.execute("set variable %s->m=('%sQAbstractItemModel'*)%s" \ -# % (dummy, d.ns, item.value.address)) -# for row in xrange(rowCount): -# for column in xrange(columnCount): -# gdb.execute("set variable %s->r=-1" % dummy) -# gdb.execute("set variable %s->c=-1" % dummy) -# with SubItem(d): - # d.putName("[%s,%s]" % (row, column)) - # value = call(item.value, "data(*%s, 0)" % dummy) - # d.putValue(str(value)) - # d.putNumChild(0) - # d.putType(" ") + # d.putNumChild(1) + # d.putName(d.ns + "QObject") + # d.putStringValue(call(item.value, "objectName()")) + # d.putType(d.ns + "QObject") + # d.put('addr="%s",' % cleanAddress(item.value.address)) + + +def qdump__QAbstractItemModel(d, item): + # Create a default-constructed QModelIndex on the stack. + ri = makeValue(d.ns + "QModelIndex", "-1, -1, 0, 0") + this_ = makeExpression(item.value) + ri_ = makeExpression(ri) + rowCount = int(parseAndEvaluate("%s.rowCount(%s)" % (this_, ri_))) + columnCount = int(parseAndEvaluate("%s.columnCount(%s)" % (this_, ri_))) + d.putValue("%d x %d" % (rowCount, columnCount)) + d.putNumChild(rowCount * columnCount) + if d.isExpanded(item): + with Children(d, rowCount * columnCount, ri.type): + i = 0 + for row in xrange(rowCount): + for column in xrange(columnCount): + with SubItem(d): + d.putField("iname", "%s.%d" % (item.iname, i)) + d.putName("[%s, %s]" % (row, column)) + mi = parseAndEvaluate("%s.index(%d,%d,%s)" + % (this_, row, column, ri_)) + #warn("MI: %s " % mi) + #name = "[%d,%d]" % (row, column) + #d.putValue("%s" % mi) + d.putItemHelper(Item(mi, item.iname, i)) + i = i + 1 + #warn("MI: %s " % mi) + #d.putName("[%d,%d]" % (row, column)) + #d.putValue("%s" % mi) + #d.putNumChild(0) + #d.putType(mi.type) + #gdb.execute("call free($ri)") + +def qdump__QModelIndex(d, item): + r = item.value["r"] + c = item.value["c"] + p = item.value["p"] + m = item.value["m"] + mm = m.dereference() + mm = mm.cast(mm.type.unqualified()) + mi = makeValue(d.ns + "QModelIndex", "%s,%s,%s,%s" % (r, c, p, m)) + mm_ = makeExpression(mm) + mi_ = makeExpression(mi) + rowCount = int(parseAndEvaluate("%s.rowCount(%s)" % (mm_, mi_))) + columnCount = int(parseAndEvaluate("%s.columnCount(%s)" % (mm_, mi_))) + + try: + # Access DisplayRole as value + value = parseAndEvaluate("%s.data(%s, 0)" % (mm_, mi_)) + v = value["d"]["data"]["ptr"] + d.putStringValue(makeValue(d.ns + 'QString', v)) + except: + d.putValue("(invalid)") + + if r >= 0 and c >= 0 and not isNull(m): + d.putNumChild(rowCount * columnCount) + if d.isExpanded(item): + with Children(d): + i = 0 + for row in xrange(rowCount): + for column in xrange(columnCount): + with SubItem(d): + d.putField("iname", "%s.%d" % (item.iname, i)) + d.putName("[%s, %s]" % (row, column)) + mi2 = parseAndEvaluate("%s.index(%d,%d,%s)" + % (mm_, row, column, mi_)) + d.putItemHelper(Item(mi2, item.iname, i)) + i = i + 1 + #d.putCallItem("parent", item, "parent()") + #with SubItem(d): + # d.putName("model") + # d.putValue(m) + # d.putType(d.ns + "QAbstractItemModel*") + # d.putNumChild(1) + else: + d.putValue("(invalid)") + d.putNumChild(0) + if d.isExpanded(item): + with Children(d): + pass + #gdb.execute("call free($mi)") + def qdump__QDateTime(d, item): @@ -517,35 +566,6 @@ def qdump__MultiMap(d, item): qdump__Map(d, item) -def qdump__QModelIndex(d, item): - r = item.value["r"] - c = item.value["c"] - p = item.value["p"] - m = item.value["m"] - if r >= 0 and c >= 0 and not isNull(m): - d.putValue("(%s, %s)" % (r, c)) - d.putNumChild(5) - if d.isExpanded(item): - with Children(d): - d.putIntItem("row", r) - d.putIntItem("column", c) - d.putCallItem("parent", item, "parent()") - - with SubItem(d): - d.putValue(m) - d.putType(d.ns + "QAbstractItemModel*") - d.putNumChild(1) - - with SubItem(d): - d.putName("model") - d.putValue(m) - d.putType(d.ns + "QAbstractItemModel*") - d.putNumChild(1) - else: - d.putValue("(invalid)") - d.putNumChild(0) - - def extractCString(table, offset): result = "" while True: diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp index 7cc43494dd47f4860ab0cff6c0374d828fd2ff63..68bdcfb2ebed9fabf550f7f61a2fb8cc6653f836 100644 --- a/tests/manual/gdbdebugger/simple/app.cpp +++ b/tests/manual/gdbdebugger/simple/app.cpp @@ -1122,12 +1122,14 @@ void testStdVector() void testQStandardItemModel() { - // This is known not to work with the Python dumpers. - // Tracked as http://bugreports.qt.nokia.com/browse/QTCREATORBUG-1009 + //char buf[100]; + //QString *s = static_cast<QString *>(static_cast<void *>(&(v.data_ptr().data.c))); + //QString *t = (QString *)&(v.data_ptr()); + QStandardItemModel m; QStandardItem *i1, *i2, *i11; m.appendRow(QList<QStandardItem *>() - << (i1 = new QStandardItem("1")) << (new QStandardItem("a"))); + << (i1 = new QStandardItem("1")) << (new QStandardItem("a")) << (new QStandardItem("a2"))); m.appendRow(QList<QStandardItem *>() << (i2 = new QStandardItem("2")) << (new QStandardItem("b"))); i1->appendRow(QList<QStandardItem *>()