src/corelib/kernel/qobject_p.h
changeset 30 5dc02b23752f
parent 18 2f34d5167611
--- a/src/corelib/kernel/qobject_p.h	Wed Jun 23 19:07:03 2010 +0300
+++ b/src/corelib/kernel/qobject_p.h	Tue Jul 06 15:10:48 2010 +0300
@@ -60,7 +60,6 @@
 #include "QtCore/qvector.h"
 #include "QtCore/qreadwritelock.h"
 #include "QtCore/qvariant.h"
-#include "private/qguard_p.h"
 
 QT_BEGIN_NAMESPACE
 
@@ -85,11 +84,11 @@
 
 enum { QObjectPrivateVersion = QT_VERSION };
 
-class Q_CORE_EXPORT QDeclarativeData
+class Q_CORE_EXPORT QAbstractDeclarativeData
 {
 public:
-    virtual ~QDeclarativeData();
-    virtual void destroyed(QObject *) = 0;
+    static void (*destroyed)(QAbstractDeclarativeData *, QObject *);
+    static void (*parentChanged)(QAbstractDeclarativeData *, QObject *, QObject *);
 };
 
 class Q_CORE_EXPORT QObjectPrivate : public QObjectData
@@ -99,13 +98,12 @@
 public:
     struct ExtraData
     {
-        ExtraData() : objectGuards(0) {}
+        ExtraData() {}
 #ifndef QT_NO_USERDATA
         QVector<QObjectUserData *> userData;
 #endif
         QList<QByteArray> propertyNames;
         QList<QVariant> propertyValues;
-        QGuard<QObject> *objectGuards; //linked list handle of QGuards
     };
 
     struct Connection
@@ -158,9 +156,9 @@
     void removePendingChildInsertedEvents(QObject *child);
 #endif
 
-    static Sender *setCurrentSender(QObject *receiver,
+    static inline Sender *setCurrentSender(QObject *receiver,
                                     Sender *sender);
-    static void resetCurrentSender(QObject *receiver,
+    static inline void resetCurrentSender(QObject *receiver,
                                    Sender *currentSender,
                                    Sender *previousSender);
     static int *setDeleteWatch(QObjectPrivate *d, int *newWatch);
@@ -189,14 +187,14 @@
     QList<QObject *> pendingChildInsertedEvents;
 #else
     // preserve binary compatibility with code compiled without Qt 3 support
-    // ### why?
-    QList<QObject *> unused;
+    // keeping the binary layout stable helps the Qt Creator debugger
+    void *unused;
 #endif
 
     QList<QPointer<QObject> > eventFilters;
     union {
         QObject *currentChildBeingDeleted;
-        QDeclarativeData *declarativeData; //extra data used by the DeclarativeUI project.
+        QAbstractDeclarativeData *declarativeData; //extra data used by the declarative module
     };
 
     // these objects are all used to indicate that a QObject was deleted
@@ -217,38 +215,31 @@
 inline bool QObjectPrivate::isSignalConnected(uint signal_index) const
 {
     return signal_index >= sizeof(connectedSignals) * 8
+        || (connectedSignals[signal_index >> 5] & (1 << (signal_index & 0x1f))
         || qt_signal_spy_callback_set.signal_begin_callback
-        || qt_signal_spy_callback_set.signal_end_callback
-        || (connectedSignals[signal_index >> 5] & (1 << (signal_index & 0x1f)));
+        || qt_signal_spy_callback_set.signal_end_callback);
+}
+
+inline QObjectPrivate::Sender *QObjectPrivate::setCurrentSender(QObject *receiver,
+                                                         Sender *sender)
+{
+    Sender *previousSender = receiver->d_func()->currentSender;
+    receiver->d_func()->currentSender = sender;
+    return previousSender;
 }
 
-
-inline void q_guard_addGuard(QGuard<QObject> *g)
+inline void QObjectPrivate::resetCurrentSender(QObject *receiver,
+                                        Sender *currentSender,
+                                        Sender *previousSender)
 {
-    QObjectPrivate *p = QObjectPrivate::get(g->o);
-    if (p->wasDeleted) {
-        qWarning("QGuard: cannot add guard to deleted object");
-        g->o = 0;
-        return;
-    }
-
-    if (!p->extraData)
-        p->extraData = new QObjectPrivate::ExtraData;
-
-    g->next = p->extraData->objectGuards;
-    p->extraData->objectGuards = g;
-    g->prev = &p->extraData->objectGuards;
-    if (g->next)
-        g->next->prev = &g->next;
+    // ref is set to zero when this object is deleted during the metacall
+    if (currentSender->ref == 1)
+        receiver->d_func()->currentSender = previousSender;
+    // if we've recursed, we need to tell the caller about the objects deletion
+    if (previousSender)
+        previousSender->ref = currentSender->ref;
 }
 
-inline void q_guard_removeGuard(QGuard<QObject> *g)
-{
-    if (g->next) g->next->prev = g->prev;
-    *g->prev = g->next;
-    g->next = 0;
-    g->prev = 0;
-}
 
 Q_DECLARE_TYPEINFO(QObjectPrivate::Connection, Q_MOVABLE_TYPE);
 Q_DECLARE_TYPEINFO(QObjectPrivate::Sender, Q_MOVABLE_TYPE);