aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlpropertycache.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@qt.io>2016-08-08 13:25:15 +0200
committerErik Verbruggen <erik.verbruggen@qt.io>2016-08-24 11:20:49 +0000
commit4e9fc0129d6b4326c2159e4fafa42a3df9d35e0a (patch)
tree3baa0a667d84d6a9d667a7fa7a582e468d45da9b /src/qml/qml/qqmlpropertycache.cpp
parent92debe6b2c69c959cb2bc27bf788edcef5e9f292 (diff)
QML: Switch from using accessors to static_metacall
Change-Id: I7a781eb3cb0af9c68b385af5752555bd9cb313d4 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlpropertycache.cpp')
-rw-r--r--src/qml/qml/qqmlpropertycache.cpp34
1 files changed, 18 insertions, 16 deletions
diff --git a/src/qml/qml/qqmlpropertycache.cpp b/src/qml/qml/qqmlpropertycache.cpp
index 5c53e342f3..ed00eddb30 100644
--- a/src/qml/qml/qqmlpropertycache.cpp
+++ b/src/qml/qml/qqmlpropertycache.cpp
@@ -150,7 +150,7 @@ void QQmlPropertyData::lazyLoad(const QMetaProperty &p)
Q_ASSERT(p.revision() <= Q_INT16_MAX);
setRevision(p.revision());
- _flags = fastFlagsForProperty(p);
+ setFlags(fastFlagsForProperty(p));
int type = static_cast<int>(p.type());
if (type == QMetaType::QObjectStar) {
@@ -171,7 +171,7 @@ void QQmlPropertyData::load(const QMetaProperty &p, QQmlEngine *engine)
setPropType(p.userType());
setCoreIndex(p.propertyIndex());
setNotifyIndex(QMetaObjectPrivate::signalIndex(p.notifySignal()));
- _flags = fastFlagsForProperty(p);
+ setFlags(fastFlagsForProperty(p));
flagsForPropertyType(propType(), engine, _flags);
Q_ASSERT(p.revision() <= Q_INT16_MAX);
setRevision(p.revision());
@@ -344,7 +344,7 @@ void QQmlPropertyCache::appendProperty(const QString &name, QQmlPropertyData::Fl
data.setPropType(propType);
data.setCoreIndex(coreIndex);
data.setNotifyIndex(notifyIndex);
- data._flags = flags;
+ data.setFlags(flags);
QQmlPropertyData *old = findNamedProperty(name);
if (old)
@@ -363,7 +363,7 @@ void QQmlPropertyCache::appendSignal(const QString &name, QQmlPropertyData::Flag
QQmlPropertyData data;
data.setPropType(QVariant::Invalid);
data.setCoreIndex(coreIndex);
- data._flags = flags;
+ data.setFlags(flags);
data.setArguments(nullptr);
QQmlPropertyData handler = data;
@@ -409,7 +409,7 @@ void QQmlPropertyCache::appendMethod(const QString &name, QQmlPropertyData::Flag
args->argumentsValid = true;
data.setArguments(args);
- data._flags = flags;
+ data.setFlags(flags);
QQmlPropertyData *old = findNamedProperty(name);
if (old)
@@ -568,9 +568,9 @@ void QQmlPropertyCache::append(const QMetaObject *metaObject,
QQmlPropertyData *sigdata = 0;
if (m.methodType() == QMetaMethod::Signal)
- data->_flags = signalFlags;
+ data->setFlags(signalFlags);
else
- data->_flags = methodFlags;
+ data->setFlags(methodFlags);
data->lazyLoad(m);
data->_flags.isDirect = !dynamicMetaObject;
@@ -650,7 +650,7 @@ void QQmlPropertyCache::append(const QMetaObject *metaObject,
QQmlPropertyData *data = &propertyIndexCache[ii - propertyIndexCacheStart];
- data->_flags = propertyFlags;
+ data->setFlags(propertyFlags);
data->lazyLoad(p);
data->_flags.isDirect = !dynamicMetaObject;
@@ -672,16 +672,18 @@ void QQmlPropertyCache::append(const QMetaObject *metaObject,
setNamedProperty(propName, ii, data, (old != 0));
}
- QQmlAccessorProperties::Property *accessorProperty = accessorProperties.property(str);
-
- // Fast properties may not be overrides or revisioned
- Q_ASSERT(accessorProperty == 0 || (old == 0 && data->revision() == 0));
+ bool isGadget = true;
+ for (const QMetaObject *it = metaObject; it != nullptr; it = it->superClass()) {
+ if (it == &QObject::staticMetaObject)
+ isGadget = false;
+ }
- if (accessorProperty) {
- data->setAccessors(accessorProperty->accessors);
- } else if (old) {
+ if (isGadget) // always dispatch over a 'normal' meta-call so the QQmlValueType can intercept
+ data->_flags.isDirect = false;
+ else
+ data->trySetStaticMetaCallFunction(metaObject->d.static_metacall, ii - propOffset);
+ if (old)
data->markAsOverrideOf(old);
- }
}
}