From d2e557c2c2d7fcf3bf7c1676df3902e115986dc2 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Fri, 11 May 2012 12:01:41 +0100 Subject: Lazily create QMetaObjects For internal QML built types, creating a metaobject each time is just wasteful. Additionally, as the property caches were always created from the intermediate QMetaObject, it was difficult to pass information directly from the compiler to the property cache. Change-Id: I769526b0edaaf16a86883f3065b75618b94e4077 Reviewed-by: Roberto Raggi --- src/qml/qml/qqmlvmemetaobject_p.h | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) (limited to 'src/qml/qml/qqmlvmemetaobject_p.h') diff --git a/src/qml/qml/qqmlvmemetaobject_p.h b/src/qml/qml/qqmlvmemetaobject_p.h index c9992471d4..9927de0b43 100644 --- a/src/qml/qml/qqmlvmemetaobject_p.h +++ b/src/qml/qml/qqmlvmemetaobject_p.h @@ -69,6 +69,7 @@ #include "qqmlcontext_p.h" #include +#include #include @@ -90,6 +91,7 @@ struct QQmlVMEMetaData int contextIdx; int propertyIdx; int flags; + int notifySignal; bool isObjectAlias() const { return propertyIdx == -1; @@ -156,7 +158,7 @@ class Q_AUTOTEST_EXPORT QQmlVMEMetaObject : public QAbstractDynamicMetaObject, public QV8GCCallback::Node { public: - QQmlVMEMetaObject(QObject *obj, const QMetaObject *other, const QQmlVMEMetaData *data); + QQmlVMEMetaObject(QObject *obj, QQmlPropertyCache *cache, const QQmlVMEMetaData *data); ~QQmlVMEMetaObject(); bool aliasTarget(int index, QObject **target, int *coreIndex, int *valueTypeIndex) const; @@ -169,22 +171,28 @@ public: void connectAliasSignal(int index); - static inline QQmlVMEMetaObject *get(const QObject *obj); + virtual QAbstractDynamicMetaObject *toDynamicMetaObject(QObject *o); + + static inline QQmlVMEMetaObject *get(QObject *o); + static QQmlVMEMetaObject *getForProperty(QObject *o, int coreIndex); + static QQmlVMEMetaObject *getForMethod(QObject *o, int coreIndex); protected: virtual int metaCall(QMetaObject::Call _c, int _id, void **_a); -private: +public: friend class QQmlVMEMetaObjectEndpoint; friend class QQmlVMEVariantQObjectPtr; QObject *object; QQmlGuardedContextData ctxt; + QQmlPropertyCache *cache; const QQmlVMEMetaData *metaData; - int propOffset; - int methodOffset; + inline int propOffset() const; + inline int methodOffset() const; + bool hasAssignedMetaObjectData; QQmlVMEVariant *data; QQmlVMEMetaObjectEndpoint *aliasEndpoints; @@ -209,14 +217,15 @@ private: QVariant readPropertyAsVariant(int); void writeProperty(int, const QVariant &); - QAbstractDynamicMetaObject *parent; + QBiPointer parent; void listChanged(int); class List : public QList { public: - List(int lpi) : notifyIndex(lpi) {} + List(int lpi, QQmlVMEMetaObject *mo) : notifyIndex(lpi), mo(mo) {} int notifyIndex; + QQmlVMEMetaObject *mo; }; QList listProperties; @@ -225,11 +234,13 @@ private: static QObject *list_at(QQmlListProperty *, int); static void list_clear(QQmlListProperty *); + void activate(QObject *, int, void **); + friend class QV8GCCallback; friend class QV8QObjectWrapper; }; -QQmlVMEMetaObject *QQmlVMEMetaObject::get(const QObject *obj) +QQmlVMEMetaObject *QQmlVMEMetaObject::get(QObject *obj) { if (obj) { if (QQmlData *data = QQmlData::get(obj)) { @@ -241,6 +252,16 @@ QQmlVMEMetaObject *QQmlVMEMetaObject::get(const QObject *obj) return 0; } +int QQmlVMEMetaObject::propOffset() const +{ + return cache->propertyOffset(); +} + +int QQmlVMEMetaObject::methodOffset() const +{ + return cache->methodOffset(); +} + QT_END_NAMESPACE #endif // QQMLVMEMETAOBJECT_P_H -- cgit v1.2.3