diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp index 0af17f99cb39be7a306ab8cd2d3c2c4433681b50..6463538c5b7008c010a5e0909b57e8968708bf9c 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.cpp +++ b/share/qtcreator/gdbmacros/gdbmacros.cpp @@ -77,6 +77,7 @@ #if USE_QT_GUI # include <QtGui/QApplication> # include <QtGui/QImage> +# include <QtGui/QRegion> # include <QtGui/QPixmap> # include <QtGui/QWidget> # include <QtGui/QFont> @@ -478,6 +479,7 @@ struct QDumper void putHash(const char *name, QChar value); void putHash(const char *name, float value); void putHash(const char *name, double value); + void putStringValue(const QString &value); void beginHash(); // start of data hash output void endHash(); // start of data hash output @@ -710,6 +712,16 @@ void QDumper::putBase64Encoded(const char *buf, int n) } } +void QDumper::putStringValue(const QString &str) +{ + if (str.isNull()) { + putItem("value", "\"\" (null)"); + } else { + putItem("value", str); + putItem("valueencoded", "2"); + } +} + void QDumper::disarm() { success = true; @@ -784,10 +796,9 @@ void QDumper::putHash(const char *name, const QString &value) { beginHash(); putItem("name", name); - putItem("value", value); + putStringValue(value); putItem("type", NS"QString"); putItem("numchild", "0"); - putItem("valueencoded", "2"); endHash(); } @@ -859,9 +870,8 @@ void QDumper::putHash(const char *name, QChar value) { beginHash(); putItem("name", name); - putItem("value", QString(QLatin1String("'%1' (%2, 0x%3)")) + putStringValue(QString(QLatin1String("'%1' (%2, 0x%3)")) .arg(value).arg(value.unicode()).arg(value.unicode(), 0, 16)); - putItem("valueencoded", "2"); putItem("type", NS"QChar"); putItem("numchild", "0"); endHash(); @@ -2850,8 +2860,7 @@ static void qDumpQString(QDumper &d) return; } - d.putItem("value", str); - d.putItem("valueencoded", "2"); + d.putStringValue(str); d.putItem("type", NS"QString"); //d.putItem("editvalue", str); // handled generically below d.putItem("numchild", "0"); @@ -2880,8 +2889,7 @@ static void qDumpQStringList(QDumper &d) d.beginChildren(n ? NS"QString" : 0); for (int i = 0; i != n; ++i) { d.beginHash(); - d.putItem("value", list[i]); - d.putItem("valueencoded", "2"); + d.putStringValue(list.at(i)); d.endHash(); } if (n < list.size()) diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index dafec2ef83b872b203001e0471ea746158568345..b9ed42aa4b5c18676b031c8c9deb7ea2de7c2d6f 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -175,8 +175,7 @@ private slots: private: void dumpQAbstractItemHelper(QModelIndex &index); void dumpQAbstractItemModelHelper(QAbstractItemModel &m); - void dumpQDateTimeHelper(const QDateTime &d); - void dumpQFileHelper(const QString &name, bool exists); + void dumpQDateTimeHelper(const QDateTime &d, bool isNull); template <typename K, typename V> void dumpQHashNodeHelper(QHash<K, V> &hash); void dumpQImageHelper(const QImage &img); void dumpQImageDataHelper(QImage &img); @@ -458,10 +457,13 @@ static const QByteArray ptrToBa(const void *p, bool symbolicNull = true) QByteArray("0x") + QByteArray::number((quintptr) p, 16)); } -static const QByteArray generateQStringSpec(const QString &str) +static const QByteArray generateQStringSpec(const QString &str, bool isNull = false) { - return QByteArray("value='%',type='"NS"QString',numchild='0',valueencoded='2'") - << utfToBase64(str); + if (isNull) + return QByteArray("value=''' (null)',type='"NS"QString',numchild='0'"); + return + QByteArray("value='%',valueencoded='2',type='"NS"QString',numchild='0'") + << utfToBase64(str); } static const QByteArray generateQCharSpec(const QChar& ch) @@ -925,7 +927,7 @@ void tst_Debugger::dumpQChar() &c, NS"QChar", false); } -void tst_Debugger::dumpQDateTimeHelper(const QDateTime &d) +void tst_Debugger::dumpQDateTimeHelper(const QDateTime &d, bool isNull) { QByteArray value; if (d.isNull()) @@ -944,10 +946,10 @@ void tst_Debugger::dumpQDateTimeHelper(const QDateTime &d) << value << generateBoolSpec(d.isNull()) << generateLongSpec((d.toTime_t())) - << generateQStringSpec(d.toString()) - << generateQStringSpec(d.toString(Qt::ISODate)) - << generateQStringSpec(d.toString(Qt::SystemLocaleDate)) - << generateQStringSpec(d.toString(Qt::LocaleDate)); + << generateQStringSpec(d.toString(), isNull) + << generateQStringSpec(d.toString(Qt::ISODate), isNull) + << generateQStringSpec(d.toString(Qt::SystemLocaleDate), isNull) + << generateQStringSpec(d.toString(Qt::LocaleDate), isNull); testDumper(expected, &d, NS"QDateTime", true); } @@ -955,11 +957,11 @@ void tst_Debugger::dumpQDateTime() { // Case 1: Null object. QDateTime d; - dumpQDateTimeHelper(d); + dumpQDateTimeHelper(d, true); // Case 2: Non-null object. d = QDateTime::currentDateTime(); - dumpQDateTimeHelper(d); + dumpQDateTimeHelper(d, false); } void tst_Debugger::dumpQDir() @@ -983,30 +985,35 @@ void tst_Debugger::dumpQDir() &dir, NS"QDir", true); } -void tst_Debugger::dumpQFileHelper(const QString &name, bool exists) -{ - QFile file(name); - QByteArray filenameAsBase64 = utfToBase64(name); - testDumper(QByteArray("value='%',valueencoded='2',type='$T',numchild='2'," - "children=[{name='fileName',value='%',type='"NS"QString'," - "numchild='0',valueencoded='2'}," - "{name='exists',value=%,type='bool',numchild='0'}]") - << filenameAsBase64 << filenameAsBase64 << boolToVal(exists), - &file, NS"QFile", true); -} void tst_Debugger::dumpQFile() { // Case 1: Empty file name => Does not exist. - dumpQFileHelper("", false); + QFile file1(""); + testDumper(QByteArray("value='',valueencoded='2',type='$T',numchild='2'," + "children=[{name='fileName',value='',valueencoded='2',type='"NS"QString'," + "numchild='0'}," + "{name='exists',value='false',type='bool',numchild='0'}]"), + &file1, NS"QFile", true); // Case 2: File that is known to exist. - QTemporaryFile file; - file.open(); - dumpQFileHelper(file.fileName(), true); + QTemporaryFile file2; + file2.open(); + testDumper(QByteArray("value='%',valueencoded='2',type='$T',numchild='2'," + "children=[{name='fileName',value='%',valueencoded='2',type='"NS"QString'," + "numchild='0'}," + "{name='exists',value='true',type='bool',numchild='0'}]") + << utfToBase64(file2.fileName()) << utfToBase64(file2.fileName()), + &file2, NS"QFile", true); // Case 3: File with a name that most likely does not exist. - dumpQFileHelper("jfjfdskjdflsdfjfdls", false); + QFile file3("jfjfdskjdflsdfjfdls"); + testDumper(QByteArray("value='%',valueencoded='2',type='$T',numchild='2'," + "children=[{name='fileName',value='%',valueencoded='2',type='"NS"QString'," + "numchild='0'}," + "{name='exists',value='false',type='bool',numchild='0'}]") + << utfToBase64(file3.fileName()) << utfToBase64(file3.fileName()), + &file3, NS"QFile", true); } void tst_Debugger::dumpQFileInfo() @@ -1062,7 +1069,7 @@ void tst_Debugger::dumpQFileInfo() expected <<= generateQStringSpec(fi.canonicalPath()); expected <<= generateQStringSpec(fi.canonicalFilePath()); expected <<= generateQStringSpec(fi.completeBaseName()); - expected <<= generateQStringSpec(fi.completeSuffix()); + expected <<= generateQStringSpec(fi.completeSuffix(), true); expected <<= generateQStringSpec(fi.baseName()); #ifdef Q_OS_MACX expected <<= generateBoolSpec(fi.isBundle()); @@ -2254,7 +2261,7 @@ void tst_Debugger::dumpQSharedPointer() void tst_Debugger::dumpQString() { QString s; - testDumper("value='',valueencoded='2',type='$T',numchild='0'", + testDumper("value=''' (null)',type='$T',numchild='0'", &s, NS"QString", false); s = "abc"; testDumper("value='YQBiAGMA',valueencoded='2',type='$T',numchild='0'", diff --git a/tests/auto/debugger/tst_gdb.cpp b/tests/auto/debugger/tst_gdb.cpp index a7ad46093ed4b03ae132209847544baefd61a3fa..8af3f2e6103f3551ffd1f1115d6d61bb674dcd79 100644 --- a/tests/auto/debugger/tst_gdb.cpp +++ b/tests/auto/debugger/tst_gdb.cpp @@ -1526,7 +1526,7 @@ void dump_QObject() /* B */ QObject ob; /* D */ ob.setObjectName("An Object"); /* E */ QObject::connect(&ob, SIGNAL(destroyed()), qApp, SLOT(quit())); - /* F */ QObject::disconnect(&ob, SIGNAL(destroyed()), qApp, SLOT(quit())); +// /* F */ QObject::disconnect(&ob, SIGNAL(destroyed()), qApp, SLOT(quit())); /* G */ ob.setObjectName("A renamed Object"); /* H */ (void) 0; } @@ -1546,7 +1546,7 @@ void tst_Gdb::dump_QObject() run("A","{iname='local.ob',name='ob'," "type='"NS"QObject',value='<not in scope>'," "numchild='0'}"); - next(3); + next(4); run("F","{iname='local.ob',name='ob',type='"NS"QObject',valueencoded='7'," "value='41006e0020004f0062006a00650063007400',numchild='4',children=["