diff options
author | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2014-11-19 16:56:40 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-12-12 14:11:13 +0100 |
commit | 1698209ab0b354202f4fa8cd052d59048fa92f89 (patch) | |
tree | cd57a1da60a2bc87c0a7e0f24111bf175fe9f7bc /src/qml/qml/qqmlpropertycache.cpp | |
parent | 68c2c56a1a3d7948c687ffae3a9d3c6cbd06a527 (diff) |
Fix QQmlPropertyCache population with gadgets
The property cache excludes the destroyed() signals as well as the deleteLater()
slot from the accessible methods. It does that by comparing the method index
against the indices of these signals/slots, which works as long as every
meta-object is through some way derived from QObject's meta object. However
that's not the case for gadgets, where these indices don't apply and
will instead accidentally hide methods.
Change-Id: I5f2b3f578192ff0df607af67832389c30bb11beb
Reviewed-by: Michael Brasser <michael.brasser@live.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/qml/qqmlpropertycache.cpp')
-rw-r--r-- | src/qml/qml/qqmlpropertycache.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/qml/qml/qqmlpropertycache.cpp b/src/qml/qml/qqmlpropertycache.cpp index dbb85f8b03..ff711605be 100644 --- a/src/qml/qml/qqmlpropertycache.cpp +++ b/src/qml/qml/qqmlpropertycache.cpp @@ -630,6 +630,8 @@ void QQmlPropertyCache::append(QQmlEngine *engine, const QMetaObject *metaObject static const int destroyedIdx1 = QObject::staticMetaObject.indexOfSignal("destroyed(QObject*)"); static const int destroyedIdx2 = QObject::staticMetaObject.indexOfSignal("destroyed()"); static const int deleteLaterIdx = QObject::staticMetaObject.indexOfSlot("deleteLater()"); + // These indices don't apply to gadgets, so don't block them. + const bool preventDestruction = metaObject->superClass() || metaObject == &QObject::staticMetaObject; int methodOffset = metaObject->methodOffset(); int signalOffset = signalCount - QMetaObjectPrivate::get(metaObject)->signalCount; @@ -640,7 +642,7 @@ void QQmlPropertyCache::append(QQmlEngine *engine, const QMetaObject *metaObject signalHandlerIndexCache.resize(signalCount - signalHandlerIndexCacheStart); int signalHandlerIndex = signalOffset; for (int ii = methodOffset; ii < methodCount; ++ii) { - if (ii == destroyedIdx1 || ii == destroyedIdx2 || ii == deleteLaterIdx) + if (preventDestruction && (ii == destroyedIdx1 || ii == destroyedIdx2 || ii == deleteLaterIdx)) continue; QMetaMethod m = metaObject->method(ii); if (m.access() == QMetaMethod::Private) @@ -1332,12 +1334,14 @@ QQmlPropertyData qQmlPropertyCacheCreate(const QMetaObject *metaObject, const QS static const int destroyedIdx1 = QObject::staticMetaObject.indexOfSignal("destroyed(QObject*)"); static const int destroyedIdx2 = QObject::staticMetaObject.indexOfSignal("destroyed()"); static const int deleteLaterIdx = QObject::staticMetaObject.indexOfSlot("deleteLater()"); + // These indices don't apply to gadgets, so don't block them. + const bool preventDestruction = metaObject->superClass() || metaObject == &QObject::staticMetaObject; const QByteArray propertyName = property.toUtf8(); int methodCount = metaObject->methodCount(); for (int ii = methodCount - 1; ii >= 0; --ii) { - if (ii == destroyedIdx1 || ii == destroyedIdx2 || ii == deleteLaterIdx) + if (preventDestruction && (ii == destroyedIdx1 || ii == destroyedIdx2 || ii == deleteLaterIdx)) continue; QMetaMethod m = metaObject->method(ii); if (m.access() == QMetaMethod::Private) |