From a2ad2bd5faae62b43bf43da2fb55cae77eedd3a6 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Thu, 18 Mar 2010 13:12:41 +0100 Subject: [PATCH] debugger: work on QVariant dumper --- share/qtcreator/gdbmacros/gdbmacros.py | 50 +++++++++++++------------ tests/manual/gdbdebugger/simple/app.cpp | 43 +++++---------------- 2 files changed, 36 insertions(+), 57 deletions(-) diff --git a/share/qtcreator/gdbmacros/gdbmacros.py b/share/qtcreator/gdbmacros/gdbmacros.py index efc31431780..896d943093b 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.py +++ b/share/qtcreator/gdbmacros/gdbmacros.py @@ -649,18 +649,13 @@ def qdump__QObject(d, item): #exp = '"((\'%sQObject\'*)%s)"' % (d.ns, item.value.address,) #warn("EXPRESSION: %s" % exp) value = call(item.value, 'property("%s")' % propertyName) - #warn("VALUE: %s" % value) - - inner, innert = qdumpHelper__QVariant(d, value["d"]) + val, inner, innert = qdumpHelper__QVariant(d, value) if len(inner): # Build-in types. - if len(innert) == 0: - innert = inner d.putType(inner) - innerType = gdb.lookup_type(inner) - val = value["d"]["data"]["ptr"].cast(innerType) d.putItemHelper(Item(val, item.iname + ".properties", - propertyName, propertyName)) + propertyName, propertyName)) + else: # User types. # func = "typeToName(('%sQVariant::Type')%d)" % (d.ns, variantType) @@ -1496,10 +1491,11 @@ def qdump__QTextCodec(d, item): d.putCallItem("mibEnum", item, "mibEnum()") d.endChildren() -def qdumpHelper__QVariant(d, d_member): +def qdumpHelper__QVariant(d, value): #warn("VARIANT TYPE: %s : " % variantType) - data = d_member["data"] - variantType = int(d_member["type"]) + data = value["d"]["data"] + variantType = int(value["d"]["type"]) + val = None inner = "" innert = "" if variantType == 0: # QVariant::Invalid @@ -1621,30 +1617,38 @@ def qdumpHelper__QVariant(d, d_member): inner = d.ns + "QVector4D" elif variantType == 86: # QVariant::Quadernion inner = d.ns + "QQuadernion" - return inner, innert + + if len(inner): + innerType = gdb.lookup_type(inner) + sizePD = gdb.lookup_type(d.ns + 'QVariant::Private::Data').sizeof + if innerType.sizeof > sizePD: + sizePS = gdb.lookup_type(d.ns + 'QVariant::PrivateShared').sizeof + val = (sizePS + data.cast(gdb.lookup_type('char').pointer())) \ + .cast(innerType.pointer()).dereference() + else: + val = data.cast(innerType) + + if len(innert) == 0: + innert = inner + + return val, inner, innert + def qdump__QVariant(d, item): - inner, innert = qdumpHelper__QVariant(d, item.value["d"]) + val, inner, innert = qdumpHelper__QVariant(d, item.value) if len(inner): # Build-in types. - if len(innert) == 0: - innert = inner d.putValue("(%s)" % innert) d.putNumChild(1) if d.isExpanded(item): - innerType = gdb.lookup_type(inner) d.beginChildren() - d.beginHash() - #d.putName("data") - #d.putField("type", innert) - val = gdb.Value(data["ptr"]).cast(innerType) - d.putItemHelper(Item(val, item.iname, "data", "data")) - d.endHash() + d.putItem(Item(val, item.iname, "data", "data")) d.endChildren() else: # User types. - func = "typeToName(('%sQVariant::Type')%d)" % (d.ns, variantType) + d_member = item.value["d"] + func = "typeToName(('%sQVariant::Type')%d)" % (d.ns, d_member["type"]) type = str(call(item.value, func)) type = type[type.find('"') + 1 : type.rfind('"')] type = type.replace("Q", d.ns + "Q") # HACK! diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp index 5834b359a9a..de48922e251 100644 --- a/tests/manual/gdbdebugger/simple/app.cpp +++ b/tests/manual/gdbdebugger/simple/app.cpp @@ -1163,6 +1163,7 @@ void testQVariant1() v = 1; v = 1.0; v = "string"; + v = QRect(100, 200, 300, 400); v = 1; } @@ -1174,7 +1175,7 @@ void testQVariant2() *(QString*)value.data() = QString("XXX"); int i = 1; -#if 0 +#if 1 QVariant var; var.setValue(1); var.setValue(2); @@ -1187,10 +1188,10 @@ void testQVariant2() var.setValue(QStringList() << "Hello" << "Hello"); var.setValue(QStringList() << "World" << "Hello" << "Hello"); #endif -#if 0 +#if 1 QVariant var3; QHostAddress ha("127.0.0.1"); - qVariantSetValue(var, ha); + var.setValue(ha); var3 = var; var3 = var; var3 = var; @@ -1590,41 +1591,15 @@ int main(int argc, char *argv[]) return 0; } -//Q_DECLARE_METATYPE(QHostAddress) +Q_DECLARE_METATYPE(QHostAddress) Q_DECLARE_METATYPE(QList<int>) +Q_DECLARE_METATYPE(QStringList) -//#define COMMA , -//Q_DECLARE_METATYPE(QMap<uint COMMA QStringList>) +typedef QMap<uint, QStringList> MyType; +#define COMMA , +Q_DECLARE_METATYPE(QMap<uint COMMA QStringList>) QT_BEGIN_NAMESPACE - -template <> -struct QMetaTypeId<QHostAddress> -{ - enum { Defined = 1 }; - static int qt_metatype_id() - { - static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); - if (!metatype_id) - metatype_id = qRegisterMetaType<QHostAddress> - ("myns::QHostAddress"); - return metatype_id; \ - } \ -}; - -template <> -struct QMetaTypeId< QMap<uint, QStringList> > -{ - enum { Defined = 1 }; - static int qt_metatype_id() - { - static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); - if (!metatype_id) - metatype_id = qRegisterMetaType< QMap<uint, QStringList> > - ("myns::QMap<uint, myns::QStringList>"); - return metatype_id; \ - } \ -}; QT_END_NAMESPACE #include "app.moc" -- GitLab