diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp index 9a92062d243a48db26fae1493398310cd5b72719..a87ca5944750d49f24ea75fbf2c3315907f03828 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.cpp +++ b/share/qtcreator/gdbmacros/gdbmacros.cpp @@ -1561,6 +1561,7 @@ static void qDumpQImage(QDumper &d) d.putItem("type", NS "QImageData"); d.putItem("addr", d.data); d.endHash(); + d.endChildren(); } d.disarm(); } diff --git a/tests/auto/debugger/main.cpp b/tests/auto/debugger/main.cpp index 75aeb277babbfcd5357b86201a1f4a0a156a5a43..052c6534f5055acbe75bc08f00c9c9077d53fd0e 100644 --- a/tests/auto/debugger/main.cpp +++ b/tests/auto/debugger/main.cpp @@ -3,8 +3,12 @@ #include <QtCore/QObject> #include <QtCore/QProcess> #include <QtCore/QFileInfo> +#if QT_VERSION >= 0x040500 +#include <QtCore/QSharedPointer> +#endif #include <QtCore/QStringList> #include <QtCore/QTextCodec> +#include <QtGui/QImage> #include <QtGui/QStandardItemModel> #include <QtGui/QStringListModel> #include <QtTest/QtTest> @@ -136,12 +140,17 @@ private slots: void dumpQFile(); void dumpQFileInfo(); void dumpQHash(); + void dumpQImage(); + void dumpQImageData(); void dumpQList_int(); void dumpQList_char(); void dumpQList_QString(); void dumpQList_QString3(); void dumpQList_Int3(); void dumpQObject(); +#if QT_VERSION >= 0x040500 + void dumpQSharedPointer(); +#endif void dumpQString(); void dumpQTextCodec(); void dumpQVariant_invalid(); @@ -165,6 +174,12 @@ private: void dumpQDateTimeHelper(QDateTime &d); void dumpQDirHelper(QDir &d); void dumpQFileHelper(const QString &name, bool exists); + void dumpQImageHelper(QImage &img); + void dumpQImageDataHelper(QImage &img); +#if QT_VERSION >= 0x040500 + template <typename T> + void dumpQSharedPointerHelper(QSharedPointer<T> &ptr, bool isSimple); +#endif void dumpQTextCodecHelper(QTextCodec *codec); }; @@ -757,6 +772,56 @@ void tst_Debugger::dumpQHash() hash.insert("!", QList<int>() << 1 << 2); } +void tst_Debugger::dumpQImageHelper(QImage &img) +{ + QByteArray expected = QByteArray("value='("). + append(QString::number(img.width())).append("x"). + append(QString::number(img.height())).append(")',type='"NS"QImage',"). + append("numchild='1',children=[{name='data',type='"NS"QImageData',"). + append("addr='").append(ptrToBa(&img)).append("'}]"); + testDumper(expected, &img, NS"QImage", true); +} + +void tst_Debugger::dumpQImage() +{ + // Case 1: Null image. + QImage img; + dumpQImageHelper(img); + + // Case 2: Normal image. + img = QImage(3, 700, QImage::Format_RGB555); + dumpQImageHelper(img); + + // Case 3: Invalid image. + img = QImage(100, 0, QImage::Format_Invalid); + dumpQImageHelper(img); +} + +void tst_Debugger::dumpQImageDataHelper(QImage &img) +{ + const QByteArray ba(QByteArray::fromRawData((const char*) img.bits(), img.numBytes())); + QByteArray expected = QByteArray("tiname='$I',addr='$A',type='"NS"QImageData',"). + append("numchild='0',value='<hover here>',valuetooltipencoded='1',"). + append("valuetooltipsize='").append(QString::number(ba.size())).append("',"). + append("valuetooltip='").append(ba.toBase64()).append("'"); + testDumper(expected, &img, NS"QImageData", false); +} + +void tst_Debugger::dumpQImageData() +{ + // Case 1: Null image. + QImage img; + dumpQImageDataHelper(img); + + // Case 2: Normal image. + img = QImage(3, 700, QImage::Format_RGB555); + dumpQImageDataHelper(img); + + // Case 3: Invalid image. + img = QImage(100, 0, QImage::Format_Invalid); + dumpQImageDataHelper(img); +} + void tst_Debugger::dumpQList_int() { QList<int> ilist; @@ -891,6 +956,48 @@ void tst_Debugger::dumpQObject() &child, NS"QObject", false); } +#if QT_VERSION >= 0x040500 +template<typename T> +void tst_Debugger::dumpQSharedPointerHelper(QSharedPointer<T> &ptr, bool isSimple) +{ + // TODO: This works only for integer types at the moment. + QByteArray expected("value = '"); + QString val; + if (isSimple) { + val = QString::number(*ptr.data()); + expected.append(val); + } + QAtomicInt *weakAddr; + QAtomicInt *strongAddr; + int weakValue; + int strongValue; + if (!ptr.isNull()) { + weakAddr = &ptr.d->weakref; + strongAddr = &ptr.d->strongref; + weakValue = *weakAddr; + strongValue = *strongAddr; + } else { + weakAddr = strongAddr = 0; + weakValue = strongValue = 0; + } + expected.append("',valuedisabled='true',numchild='1',children=["). + append("{name='data',addr='").append(ptrToBa(ptr.data())). + append("',type='int',value='").append(val).append("'},"). + append("{name='weakref',value='").append(QString::number(weakValue)). + append("',type='int',addr='").append(ptrToBa(weakAddr)).append("',numchild='0'},"). + append("{name='data',value='").append(val).append("'},"). + append("{name='strongref',value='").append(QString::number(strongValue)). + append("',type='int',addr='").append(ptrToBa(strongAddr)).append("',numchild='0'}]"); + testDumper(expected, &ptr, NS"QSharedPointer", true); +} + +void tst_Debugger::dumpQSharedPointer() +{ + QSharedPointer<int> ptr(new int(99)); + // dumpQSharedPointerHelper(ptr, 1, 0, true); +} +#endif + void tst_Debugger::dumpQString() { QString s;