aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2012-02-14 12:43:43 +0000
committerQt by Nokia <qt-info@nokia.com>2012-02-20 14:48:12 +0100
commit79e42fca6f2dadfa51d95489371c44640ae3033b (patch)
tree5210f981cd952230a42ebc85b6572d76aa425780 /src
parent549916563e693fc2835d1fa0d5baa3a77b027284 (diff)
Reduce the size of QDeclarativeAbstractBinding
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>
Diffstat (limited to 'src')
-rw-r--r--src/declarative/qml/qdeclarativebinding.cpp14
-rw-r--r--src/declarative/qml/qdeclarativebinding_p.h17
2 files changed, 21 insertions, 10 deletions
diff --git a/src/declarative/qml/qdeclarativebinding.cpp b/src/declarative/qml/qdeclarativebinding.cpp
index 1fa4594ed1..359f169fac 100644
--- a/src/declarative/qml/qdeclarativebinding.cpp
+++ b/src/declarative/qml/qdeclarativebinding.cpp
@@ -56,14 +56,14 @@
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;
}
}
diff --git a/src/declarative/qml/qdeclarativebinding_p.h b/src/declarative/qml/qdeclarativebinding_p.h
index 00a38006f7..e87cc7d609 100644
--- a/src/declarative/qml/qdeclarativebinding_p.h
+++ b/src/declarative/qml/qdeclarativebinding_p.h
@@ -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*)