diff options
author | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2015-04-10 12:34:46 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2015-04-16 13:40:17 +0000 |
commit | b220a20552838fbafbbf126b9e50d148ae76518d (patch) | |
tree | 172e81559ed85ac0cdfedd4af9a9029bbdb15ecd /src/qml/qml/qqmlvaluetype.cpp | |
parent | 3fa8540800c43ccc4e4c1f8f323fb5ade34044db (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.cpp | 12 |
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 *) |