diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2012-05-11 12:01:41 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-24 12:52:43 +0200 |
commit | d2e557c2c2d7fcf3bf7c1676df3902e115986dc2 (patch) | |
tree | 65f47e443efa9635a2634880c01dc439817f9566 /src/qml/qml/qqmlvmemetaobject_p.h | |
parent | 0a3ff88f851771e52d119fab90c0254de6950585 (diff) |
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 <roberto.raggi@nokia.com>
Diffstat (limited to 'src/qml/qml/qqmlvmemetaobject_p.h')
-rw-r--r-- | src/qml/qml/qqmlvmemetaobject_p.h | 37 |
1 files changed, 29 insertions, 8 deletions
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 <private/qv8engine_p.h> +#include <private/qflagpointer_p.h> #include <private/qv8_p.h> @@ -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<QDynamicMetaObjectData, const QMetaObject> parent; void listChanged(int); class List : public QList<QObject*> { public: - List(int lpi) : notifyIndex(lpi) {} + List(int lpi, QQmlVMEMetaObject *mo) : notifyIndex(lpi), mo(mo) {} int notifyIndex; + QQmlVMEMetaObject *mo; }; QList<List> listProperties; @@ -225,11 +234,13 @@ private: static QObject *list_at(QQmlListProperty<QObject> *, int); static void list_clear(QQmlListProperty<QObject> *); + 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 |