From b220a20552838fbafbbf126b9e50d148ae76518d Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Fri, 10 Apr 2015 12:34:46 +0200 Subject: 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 --- src/qml/qml/qqmlvaluetype.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'src/qml/qml/qqmlvaluetype.cpp') 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 #include #include +#include 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 *) -- cgit v1.2.3