aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlvmemetaobject_p.h
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2012-05-11 12:01:41 +0100
committerQt by Nokia <qt-info@nokia.com>2012-05-24 12:52:43 +0200
commitd2e557c2c2d7fcf3bf7c1676df3902e115986dc2 (patch)
tree65f47e443efa9635a2634880c01dc439817f9566 /src/qml/qml/qqmlvmemetaobject_p.h
parent0a3ff88f851771e52d119fab90c0254de6950585 (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.h37
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