From f7a3fa1253f2303b1199c694b6bedc12a836ebf9 Mon Sep 17 00:00:00 2001
From: ck <qt-info@nokia.com>
Date: Tue, 11 Aug 2009 10:28:24 +0200
Subject: [PATCH] Debugger: Adapted dumper auto tests to new QObjectPrivate
 changes.

Also added checks to guard against these kind of changes in the future.
---
 share/qtcreator/gdbmacros/gdbmacros_p.h | 27 ++++++++-
 tests/auto/debugger/main.cpp            | 74 ++++++++++++++++++++++---
 2 files changed, 89 insertions(+), 12 deletions(-)

diff --git a/share/qtcreator/gdbmacros/gdbmacros_p.h b/share/qtcreator/gdbmacros/gdbmacros_p.h
index dc756597cf8..dcbc9391eff 100644
--- a/share/qtcreator/gdbmacros/gdbmacros_p.h
+++ b/share/qtcreator/gdbmacros/gdbmacros_p.h
@@ -86,15 +86,36 @@ struct Connection
     int method;
     uint connectionType : 3; // 0 == auto, 1 == direct, 2 == queued, 4 == blocking
     QBasicAtomicPointer<int> argumentTypes;
+    Connection *nextConnectionList;
     //senders linked list
     Connection *next;
     Connection **prev;
 };
 
-typedef QList<Connection *> ConnectionList;
+struct ConnectionList
+{
+    ConnectionList() : first(0), last(0) { }
+    int size() const
+    {
+        int count = 0;
+        for (Connection *c = first; c != 0; c = c->nextConnectionList)
+            ++count;
+        return count;
+    }
+
+    Connection *first;
+    Connection *last;
+};
+
 typedef Connection *SenderList;
 
-static inline const Connection &connectionAt(const ConnectionList &l, int i) { return *l.at(i); }
+static inline const Connection &connectionAt(const ConnectionList &l, int i)
+{
+    Connection *conn = l.first;
+    for (int cnt = 0; cnt < i; ++cnt)
+        conn = conn->nextConnectionList;
+    return *conn;
+}
 #endif
 
 class ObjectPrivate : public QObjectData
@@ -130,7 +151,7 @@ public:
     void *currentChildBeingDeleted;
     void *declarativeData;
     void *objectGuards;
-    QAtomicPointer<void> sharedRefCount;
+    QAtomicPointer<void> sharedRefcount;
     int *deleteWatch;
 #endif
 };
diff --git a/tests/auto/debugger/main.cpp b/tests/auto/debugger/main.cpp
index 5f687ac8019..4922a841e7e 100644
--- a/tests/auto/debugger/main.cpp
+++ b/tests/auto/debugger/main.cpp
@@ -580,6 +580,33 @@ template <> const char *typeToNumchild(const QString &)
     return "0";
 }
 
+
+static int qobj_priv_conn_list_size(const QObjectPrivate::ConnectionList &l)
+{
+#if QT_VERSION >= 0x040600
+    int count = 0;
+    for (QObjectPrivate::Connection *c = l.first; c != 0; c = c->nextConnectionList)
+        ++count;
+    return count;
+#else
+    return l.size();
+#endif
+}
+
+static QObjectPrivate::Connection &qobj_priv_conn_list_at(
+        const QObjectPrivate::ConnectionList &l, int pos)
+{
+#if QT_VERSION >= 0x040600
+    QObjectPrivate::Connection *c = l.first;
+    for (int i = 0; i < pos; ++i)
+        c = c->nextConnectionList;
+    return *c;
+#else
+    return l.at(pos);
+#endif
+}
+
+
 void tst_Debugger::dumpQAbstractItemHelper(QModelIndex &index)
 {
     const QAbstractItemModel *model = index.model();
@@ -1592,8 +1619,9 @@ void tst_Debugger::dumpQObjectSignalHelper(QObject &o, int sigNum)
     QObjectPrivate::ConnectionList connList =
         connLists != 0 && connLists->size() > sigNum ?
         connLists->at(sigNum) : QObjectPrivate::ConnectionList();
-    for (int i = 0; i < connList.size(); ++i) {
-        const QObjectPrivate::Connection *conn = connList.at(i);
+    int i = 0;
+    for (QObjectPrivate::Connection *conn = connList.first; conn != 0;
+         ++i, conn = conn->nextConnectionList) {
         const QString iStr = QString::number(i);
         expected.append("{name='").append(iStr).append(" receiver',");
         if (conn->receiver == &o)
@@ -1615,10 +1643,10 @@ void tst_Debugger::dumpQObjectSignalHelper(QObject &o, int sigNum)
         expected.append("',numchild='0'},{name='").append(iStr).append(" type',type='',value='<").
             append(connectionType(conn->connectionType)).append(" connection>',").
             append("numchild='0'}");
-        if (i < connList.size() - 1)
+        if (conn != connList.last)
             expected.append(",");
     }
-    expected.append("],numchild='").append(QString::number(connList.size())).append("'");
+    expected.append("],numchild='").append(QString::number(i)).append("'");
 #endif
     testDumper(expected, &o, NS"QObjectSignal", true, "", "", sigNum);
 }
@@ -1692,7 +1720,8 @@ void tst_Debugger::dumpQObjectSignalListHelper(QObject &o)
                 connLists != 0 && connLists->size() > sigNum ?
                 connLists->at(sigNum) : QObjectPrivate::ConnectionList();
         expected.append("{name='").append(QString::number(sigNum)).append("',value='").
-            append(signature).append("',numchild='").append(QString::number(connList.size())).
+            append(signature).append("',numchild='").
+            append(QString::number(qobj_priv_conn_list_size(connList))).
             append("',addr='").append(addrString).append("',type='"NS"QObjectSignal'}");
         if (i < methods.size() - 1)
             expected.append(",");
@@ -1755,8 +1784,10 @@ void tst_Debugger::dumpQObjectSlotHelper(QObject &o, int slot)
         const QObjectPrivate::ConnectionList &connList =
                 connLists != 0 && connLists->size() > signal ?
                 connLists->at(signal) : QObjectPrivate::ConnectionList();
-        for (int i = 0; i < connList.size(); ++i) {
-            const QObjectPrivate::Connection *conn = connList.at(i);
+        const int listSize = qobj_priv_conn_list_size(connList);
+        for (int i = 0; i < listSize; ++i) {
+            const QObjectPrivate::Connection *conn =
+                    &qobj_priv_conn_list_at(connList, i);
             if (conn->receiver == &o && conn->method == slot) {
                 ++numChild;
                 const QMetaMethod &method = sender->metaObject()->method(signal);
@@ -1869,8 +1900,10 @@ void tst_Debugger::dumpQObjectSlotListHelper(QObject &o)
                 const QObjectPrivate::ConnectionList &connList =
                         connLists != 0 && connLists->size() > signal ?
                         connLists->at(signal) : QObjectPrivate::ConnectionList();
-                for (int c = 0; c != connList.size(); ++c) {
-                    const QObjectPrivate::Connection *conn = connList.at(c);
+                const int listSize = qobj_priv_conn_list_size(connList);
+                for (int c = 0; c != listSize; ++c) {
+                    const QObjectPrivate::Connection *conn =
+                            &qobj_priv_conn_list_at(connList, c);
                     if (conn->receiver == &o && conn->method == k)
                         ++numChild;
                 }
@@ -2116,9 +2149,32 @@ void tst_Debugger::dumpQTextCodec()
 // Creator
 //
 
+#define VERIFY_OFFSETOF(member)                                               \
+do {                                                                          \
+    QVERIFY(offsetof(QObjectPrivate, member) == offsetof(ObjectPrivate, member)); \
+} while (0)
+
+
 void tst_Debugger::initTestCase()
 {
     QVERIFY(sizeof(QObjectPrivate) == sizeof(ObjectPrivate));
+    VERIFY_OFFSETOF(threadData);
+    VERIFY_OFFSETOF(extraData);
+    VERIFY_OFFSETOF(objectName);
+    VERIFY_OFFSETOF(connectionLists);
+    VERIFY_OFFSETOF(senders);
+    VERIFY_OFFSETOF(currentSender);
+    VERIFY_OFFSETOF(eventFilters);
+    VERIFY_OFFSETOF(currentChildBeingDeleted);
+    VERIFY_OFFSETOF(connectedSignals);
+    VERIFY_OFFSETOF(deleteWatch);
+#if QT_VERSION < 0x040600
+    VERIFY_OFFSETOF(pendingChildInsertedEvents);
+#else
+    VERIFY_OFFSETOF(declarativeData);
+    VERIFY_OFFSETOF(objectGuards);
+    VERIFY_OFFSETOF(sharedRefcount);
+#endif
 }
 
 void tst_Debugger::readStandardOutput()
-- 
GitLab