diff options
author | Lars Knoll <lars.knoll@theqtcompany.com> | 2015-04-16 15:40:33 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2015-06-05 08:37:26 +0000 |
commit | db568f812464644b36418415a05399ccdf2022c2 (patch) | |
tree | 162b4a21affe9a7b153519e5105eb6d1b5f7b02e /src/qml/qml/qqmlbinding.cpp | |
parent | 6d163779711d4601931ae0f82910794fb2498136 (diff) |
Remove the QQmlPropertyData from the binding
Simply store the encoded property index instead.
Change-Id: I235030c3d658df3e5df6efafc9c5b2c22200e0a8
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/qml/qml/qqmlbinding.cpp')
-rw-r--r-- | src/qml/qml/qqmlbinding.cpp | 80 |
1 files changed, 59 insertions, 21 deletions
diff --git a/src/qml/qml/qqmlbinding.cpp b/src/qml/qml/qqmlbinding.cpp index b9ca15af27..24818cbcd1 100644 --- a/src/qml/qml/qqmlbinding.cpp +++ b/src/qml/qml/qqmlbinding.cpp @@ -161,7 +161,7 @@ void QQmlBinding::update(QQmlPropertyPrivate::WriteFlags flags) Q_ASSERT(f); if (updatingFlag()) { - QQmlProperty p = QQmlPropertyPrivate::restore(targetObject(), m_core, 0); + QQmlProperty p = QQmlPropertyPrivate::restore(targetObject(), getPropertyData(), 0); QQmlAbstractBinding::printBindingLoopError(p); return; } @@ -171,15 +171,17 @@ void QQmlBinding::update(QQmlPropertyPrivate::WriteFlags flags) QQmlJavaScriptExpression::DeleteWatcher watcher(this); - if (m_core.propType == qMetaTypeId<QQmlBinding *>()) { + QQmlPropertyData pd = getPropertyData(); - int idx = m_core.coreIndex; + if (pd.propType == qMetaTypeId<QQmlBinding *>()) { + + int idx = pd.coreIndex; Q_ASSERT(idx != -1); QQmlBinding *t = this; int status = -1; void *a[] = { &t, 0, &status, &flags }; - QMetaObject::metacall(*m_coreObject, QMetaObject::WriteProperty, idx, a); + QMetaObject::metacall(*m_target, QMetaObject::WriteProperty, idx, a); } else { ep->referenceScarceResources(); @@ -190,7 +192,7 @@ void QQmlBinding::update(QQmlPropertyPrivate::WriteFlags flags) bool needsErrorLocationData = false; if (!watcher.wasDeleted() && !hasError()) - needsErrorLocationData = !QQmlPropertyPrivate::writeBinding(*m_coreObject, m_core, context(), + needsErrorLocationData = !QQmlPropertyPrivate::writeBinding(*m_target, pd, context(), this, result, isUndefined, flags); if (!watcher.wasDeleted()) { @@ -270,12 +272,12 @@ QString QQmlBinding::expression() const QObject *QQmlBinding::targetObject() const { - return *m_coreObject; + return *m_target; } int QQmlBinding::targetPropertyIndex() const { - return m_core.encodedIndex(); + return m_index; } void QQmlBinding::setTarget(const QQmlProperty &prop) @@ -285,18 +287,23 @@ void QQmlBinding::setTarget(const QQmlProperty &prop) void QQmlBinding::setTarget(QObject *object, const QQmlPropertyData &core) { - m_coreObject = object; - m_core = core; + m_target = object; + QQmlPropertyData pd = core; - while (m_core.isAlias()) { + if (!object) { + m_index = -1; + return; + } + + while (pd.isAlias()) { int coreIndex = core.coreIndex; int valueTypeIndex = core.getValueTypeCoreIndex(); QQmlVMEMetaObject *vme = QQmlVMEMetaObject::getForProperty(object, coreIndex); int aValueTypeIndex; if (!vme->aliasTarget(coreIndex, &object, &coreIndex, &aValueTypeIndex)) { - m_core.coreIndex = -1; - m_coreObject = 0; + m_target = 0; + m_index = -1; return; } if (valueTypeIndex == -1) @@ -304,25 +311,56 @@ void QQmlBinding::setTarget(QObject *object, const QQmlPropertyData &core) QQmlData *data = QQmlData::get(object, false); if (!data || !data->propertyCache) { - m_core.coreIndex = -1; - m_coreObject = 0; + m_target = 0; + m_index = -1; return; } QQmlPropertyData *propertyData = data->propertyCache->property(coreIndex); Q_ASSERT(propertyData); - m_coreObject = object; - m_core = *propertyData; + m_target = object; + pd = *propertyData; if (valueTypeIndex != -1) { - const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(m_core.propType); + const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(pd.propType); Q_ASSERT(valueTypeMetaObject); QMetaProperty vtProp = valueTypeMetaObject->property(valueTypeIndex); - m_core.setFlags(m_core.getFlags() | QQmlPropertyData::IsValueTypeVirtual); - m_core.valueTypeFlags = QQmlPropertyData::flagsForProperty(vtProp); - m_core.valueTypePropType = vtProp.userType(); - m_core.valueTypeCoreIndex = valueTypeIndex; + pd.setFlags(pd.getFlags() | QQmlPropertyData::IsValueTypeVirtual); + pd.valueTypeFlags = QQmlPropertyData::flagsForProperty(vtProp); + pd.valueTypePropType = vtProp.userType(); + pd.valueTypeCoreIndex = valueTypeIndex; } } + m_index = pd.encodedIndex(); + + QQmlData *data = QQmlData::get(*m_target, true); + if (!data->propertyCache) { + data->propertyCache = QQmlEnginePrivate::get(context()->engine)->cache(m_target->metaObject()); + data->propertyCache->addref(); + } +} + +QQmlPropertyData QQmlBinding::getPropertyData() const +{ + int coreIndex; + int valueTypeIndex = QQmlPropertyData::decodeValueTypePropertyIndex(m_index, &coreIndex); + + QQmlData *data = QQmlData::get(*m_target, false); + Q_ASSERT(data && data->propertyCache); + + QQmlPropertyData *propertyData = data->propertyCache->property(coreIndex); + Q_ASSERT(propertyData); + + QQmlPropertyData d = *propertyData; + if (valueTypeIndex != -1) { + const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(d.propType); + Q_ASSERT(valueTypeMetaObject); + QMetaProperty vtProp = valueTypeMetaObject->property(valueTypeIndex); + d.setFlags(d.getFlags() | QQmlPropertyData::IsValueTypeVirtual); + d.valueTypeFlags = QQmlPropertyData::flagsForProperty(vtProp); + d.valueTypePropType = vtProp.userType(); + d.valueTypeCoreIndex = valueTypeIndex; + } + return d; } QT_END_NAMESPACE |