From 10a712eb980f32492c65dcb8441f6c5d29192a82 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Thu, 10 Sep 2015 14:29:28 +0200 Subject: Reimplement the right metaCall() method The goal should be to make these dynamic metaobjects independent of the concrete QObject instance. Change-Id: I13448420d15792918cc30e994a8d6d83216a0a1a Reviewed-by: Simon Hausmann --- src/qml/qml/qqmlopenmetaobject.cpp | 10 ++++++---- src/qml/qml/qqmlopenmetaobject_p.h | 2 +- src/qml/qml/qqmlproxymetaobject.cpp | 6 ++++-- src/qml/qml/qqmlproxymetaobject_p.h | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) (limited to 'src/qml/qml') diff --git a/src/qml/qml/qqmlopenmetaobject.cpp b/src/qml/qml/qqmlopenmetaobject.cpp index 16138508dd..9188ba6174 100644 --- a/src/qml/qml/qqmlopenmetaobject.cpp +++ b/src/qml/qml/qqmlopenmetaobject.cpp @@ -261,8 +261,10 @@ void QQmlOpenMetaObject::emitPropertyNotification(const QByteArray &propertyName activate(d->object, *iter + d->type->d->signalOffset, 0); } -int QQmlOpenMetaObject::metaCall(QMetaObject::Call c, int id, void **a) +int QQmlOpenMetaObject::metaCall(QObject *o, QMetaObject::Call c, int id, void **a) { + Q_ASSERT(d->object == o); + if (( c == QMetaObject::ReadProperty || c == QMetaObject::WriteProperty) && id >= d->type->d->propertyOffset) { int propId = id - d->type->d->propertyOffset; @@ -276,15 +278,15 @@ int QQmlOpenMetaObject::metaCall(QMetaObject::Call c, int id, void **a) prop.first = propertyWriteValue(propId, *reinterpret_cast(a[0])); prop.second = true; propertyWritten(propId); - activate(d->object, d->type->d->signalOffset + propId, 0); + activate(o, d->type->d->signalOffset + propId, 0); } } return -1; } else { if (d->parent) - return d->parent->metaCall(c, id, a); + return d->parent->metaCall(o, c, id, a); else - return d->object->qt_metacall(c, id, a); + return o->qt_metacall(c, id, a); } } diff --git a/src/qml/qml/qqmlopenmetaobject_p.h b/src/qml/qml/qqmlopenmetaobject_p.h index 75ce9addd6..99e2f79db4 100644 --- a/src/qml/qml/qqmlopenmetaobject_p.h +++ b/src/qml/qml/qqmlopenmetaobject_p.h @@ -105,7 +105,7 @@ public: void emitPropertyNotification(const QByteArray &propertyName); protected: - virtual int metaCall(QMetaObject::Call _c, int _id, void **_a); + virtual int metaCall(QObject *o, QMetaObject::Call _c, int _id, void **_a); virtual int createProperty(const char *, const char *); virtual void propertyRead(int); diff --git a/src/qml/qml/qqmlproxymetaobject.cpp b/src/qml/qml/qqmlproxymetaobject.cpp index bf735a9f0c..ba5215b831 100644 --- a/src/qml/qml/qqmlproxymetaobject.cpp +++ b/src/qml/qml/qqmlproxymetaobject.cpp @@ -59,8 +59,10 @@ QQmlProxyMetaObject::~QQmlProxyMetaObject() proxies = 0; } -int QQmlProxyMetaObject::metaCall(QMetaObject::Call c, int id, void **a) +int QQmlProxyMetaObject::metaCall(QObject *o, QMetaObject::Call c, int id, void **a) { + Q_ASSERT(object == o); + if ((c == QMetaObject::ReadProperty || c == QMetaObject::WriteProperty) && id >= metaObjects->last().propertyOffset) { @@ -108,7 +110,7 @@ int QQmlProxyMetaObject::metaCall(QMetaObject::Call c, int id, void **a) } if (parent) - return parent->metaCall(c, id, a); + return parent->metaCall(o, c, id, a); else return object->qt_metacall(c, id, a); } diff --git a/src/qml/qml/qqmlproxymetaobject_p.h b/src/qml/qml/qqmlproxymetaobject_p.h index 862b0fb7c2..6ae35fe11f 100644 --- a/src/qml/qml/qqmlproxymetaobject_p.h +++ b/src/qml/qml/qqmlproxymetaobject_p.h @@ -71,7 +71,7 @@ public: virtual ~QQmlProxyMetaObject(); protected: - virtual int metaCall(QMetaObject::Call _c, int _id, void **_a); + virtual int metaCall(QObject *o, QMetaObject::Call _c, int _id, void **_a); private: QList *metaObjects; -- cgit v1.2.3