Reduce the size of QDeclarativeAbstractBinding
authorAaron Kennedy <aaron.kennedy@nokia.com>
Tue, 14 Feb 2012 12:43:43 +0000 (12:43 +0000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 20 Feb 2012 13:48:12 +0000 (14:48 +0100)
The weak pointer in every binding is rarely used, so we can store it in
the same memory as the me ptr.

Change-Id: I3ce7d767fa25cf5b6e6d30c4f022d0e94fc3ffbb
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
src/declarative/qml/qdeclarativebinding.cpp
src/declarative/qml/qdeclarativebinding_p.h

index 1fa4594..359f169 100644 (file)
 QT_BEGIN_NAMESPACE
 
 QDeclarativeAbstractBinding::QDeclarativeAbstractBinding()
-: m_object(0), m_propertyIndex(-1), m_mePtr(0), m_prevBinding(0), m_nextBinding(0)
+: m_object(0), m_propertyIndex(-1), m_prevBinding(0), m_nextBinding(0)
 {
 }
 
 QDeclarativeAbstractBinding::~QDeclarativeAbstractBinding()
 {
     Q_ASSERT(m_prevBinding == 0);
-    Q_ASSERT(m_mePtr == 0);
+    Q_ASSERT(*m_mePtr == 0);
 }
 
 /*!
@@ -173,16 +173,16 @@ static void bindingDummyDeleter(QDeclarativeAbstractBinding *)
 
 QDeclarativeAbstractBinding::Pointer QDeclarativeAbstractBinding::weakPointer()
 {
-    if (m_selfPointer.isNull())
-        m_selfPointer = QSharedPointer<QDeclarativeAbstractBinding>(this, bindingDummyDeleter);
+    if (m_mePtr.value().isNull())
+        m_mePtr.value() = QSharedPointer<QDeclarativeAbstractBinding>(this, bindingDummyDeleter);
 
-    return m_selfPointer.toWeakRef();
+    return m_mePtr.value().toWeakRef();
 }
 
 void QDeclarativeAbstractBinding::clear()
 {
-    if (m_mePtr) {
-        *m_mePtr = 0;
+    if (!m_mePtr.isNull()) {
+        **m_mePtr = 0;
         m_mePtr = 0;
     }
 }
index 00a3800..e87cc7d 100644 (file)
@@ -62,6 +62,8 @@
 #include <QtCore/QObject>
 #include <QtCore/QMetaProperty>
 
+#include <private/qpointervaluepair_p.h>
+
 QT_BEGIN_NAMESPACE
 
 class Q_DECLARATIVE_PRIVATE_EXPORT QDeclarativeAbstractBinding
@@ -90,7 +92,7 @@ public:
     void addToObject(QObject *, int);
     void removeFromObject();
 
-    static Pointer getPointer(QDeclarativeAbstractBinding *p) { return p ? p->weakPointer() : Pointer(); }
+    static inline Pointer getPointer(QDeclarativeAbstractBinding *p);
 
 protected:
     virtual ~QDeclarativeAbstractBinding();
@@ -108,10 +110,13 @@ private:
 
     QObject *m_object;
     int m_propertyIndex;
-    QDeclarativeAbstractBinding **m_mePtr;
+
+    typedef QSharedPointer<QDeclarativeAbstractBinding> SharedPointer;
+    // To save memory, we also store the rarely used weakPointer() instance in here
+    QPointerValuePair<QDeclarativeAbstractBinding*, SharedPointer> m_mePtr;
+
     QDeclarativeAbstractBinding **m_prevBinding;
     QDeclarativeAbstractBinding  *m_nextBinding;
-    QSharedPointer<QDeclarativeAbstractBinding> m_selfPointer;
 };
 
 class QDeclarativeValueTypeProxyBinding : public QDeclarativeAbstractBinding
@@ -187,6 +192,12 @@ private:
 
 Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativeBinding::EvaluateFlags)
 
+QDeclarativeAbstractBinding::Pointer
+QDeclarativeAbstractBinding::getPointer(QDeclarativeAbstractBinding *p)
+{
+    return p ? p->weakPointer() : Pointer();
+}
+
 QT_END_NAMESPACE
 
 Q_DECLARE_METATYPE(QDeclarativeBinding*)