aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlpropertycache.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@theqtcompany.com>2014-11-19 16:56:40 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2014-12-12 14:11:13 +0100
commit1698209ab0b354202f4fa8cd052d59048fa92f89 (patch)
treecd57a1da60a2bc87c0a7e0f24111bf175fe9f7bc /src/qml/qml/qqmlpropertycache.cpp
parent68c2c56a1a3d7948c687ffae3a9d3c6cbd06a527 (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.cpp8
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)