aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlvaluetype.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@theqtcompany.com>2015-04-10 12:34:46 +0200
committerSimon Hausmann <simon.hausmann@theqtcompany.com>2015-04-16 13:40:17 +0000
commitb220a20552838fbafbbf126b9e50d148ae76518d (patch)
tree172e81559ed85ac0cdfedd4af9a9029bbdb15ecd /src/qml/qml/qqmlvaluetype.cpp
parent3fa8540800c43ccc4e4c1f8f323fb5ade34044db (diff)
Speed up value type binding creation
* Avoid calling QMetaType::construct/destruct(typeId, ...) as that requires repeated lookups in the type registry. Instead cache the constructor/destructor/etc. function addresses in the QQmlValueType singletons as QMetaType * Allocate memory for the gadget pointer lazily, to accommodate the common case of a value type binding by property reference. Change-Id: I98a3ac73453b8f80027c06401b4f29a9707949d2 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/qml/qqmlvaluetype.cpp')
-rw-r--r--src/qml/qml/qqmlvaluetype.cpp12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/qml/qml/qqmlvaluetype.cpp b/src/qml/qml/qqmlvaluetype.cpp
index 490ac66f1f..341ddf802d 100644
--- a/src/qml/qml/qqmlvaluetype.cpp
+++ b/src/qml/qml/qqmlvaluetype.cpp
@@ -38,6 +38,7 @@
#include <QtCore/qdebug.h>
#include <private/qmetaobjectbuilder_p.h>
#include <private/qqmlmodelindexvaluetype_p.h>
+#include <private/qmetatype_p.h>
QT_BEGIN_NAMESPACE
@@ -182,8 +183,9 @@ void QQmlValueTypeFactory::registerValueTypes(const char *uri, int versionMajor,
}
QQmlValueType::QQmlValueType(int typeId, const QMetaObject *gadgetMetaObject)
- : typeId(typeId)
- , gadgetPtr(QMetaType::create(typeId))
+ : gadgetPtr(QMetaType::create(typeId))
+ , typeId(typeId)
+ , metaType(typeId)
{
QObjectPrivate *op = QObjectPrivate::get(this);
Q_ASSERT(!op->metaObject);
@@ -201,7 +203,7 @@ QQmlValueType::~QQmlValueType()
Q_ASSERT(op->metaObject == this);
op->metaObject = 0;
::free((void*)_metaObject);
- QMetaType::destroy(typeId, gadgetPtr);
+ metaType.destroy(gadgetPtr);
}
void QQmlValueType::read(QObject *obj, int idx)
@@ -227,8 +229,8 @@ QVariant QQmlValueType::value()
void QQmlValueType::setValue(const QVariant &value)
{
Q_ASSERT(typeId == value.userType());
- QMetaType::destruct(typeId, gadgetPtr);
- QMetaType::construct(typeId, gadgetPtr, value.constData());
+ metaType.destruct(gadgetPtr);
+ metaType.construct(gadgetPtr, value.constData());
}
QAbstractDynamicMetaObject *QQmlValueType::toDynamicMetaObject(QObject *)