summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qproperty.cpp
diff options
context:
space:
mode:
authorFabian Kosmale <fabian.kosmale@qt.io>2020-12-01 12:01:06 +0100
committerFabian Kosmale <fabian.kosmale@qt.io>2020-12-01 15:06:35 +0100
commitb21dba98e3e557eece0497aeea0f0beb70cc62da (patch)
treeb453446812b398d0d6dcafbcc90548b6b689c485 /src/corelib/kernel/qproperty.cpp
parentcea8b5832c56e92aba2b028afc965ddcf384d37b (diff)
QProperty: Avoid spurious dependencies by suspending binding state
Avoid spurious bindings by resetting the binding state before calling the setter of eager properties. Fixes: QTBUG-88999 Pick-to: 6.0 Change-Id: I1e3b5662307d906598335a21d306be9c606529d4 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/corelib/kernel/qproperty.cpp')
-rw-r--r--src/corelib/kernel/qproperty.cpp19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/corelib/kernel/qproperty.cpp b/src/corelib/kernel/qproperty.cpp
index bbcd1bf0fa..e9256c7b42 100644
--- a/src/corelib/kernel/qproperty.cpp
+++ b/src/corelib/kernel/qproperty.cpp
@@ -303,7 +303,7 @@ BindingEvaluationState::BindingEvaluationState(QPropertyBindingPrivate *binding,
binding->clearDependencyObservers();
}
-CurrentCompatProperty::CurrentCompatProperty(QBindingStatus *status, QUntypedPropertyData *property)
+CompatPropertySafePoint::CompatPropertySafePoint(QBindingStatus *status, QUntypedPropertyData *property)
: property(property)
{
// store a pointer to the currentBindingEvaluationState to avoid a TLS lookup in
@@ -311,6 +311,10 @@ CurrentCompatProperty::CurrentCompatProperty(QBindingStatus *status, QUntypedPro
currentState = &status->currentCompatProperty;
previousState = *currentState;
*currentState = this;
+
+ currentlyEvaluatingBindingList = &bindingStatus.currentlyEvaluatingBinding;
+ bindingState = *currentlyEvaluatingBindingList;
+ *currentlyEvaluatingBindingList = nullptr;
}
QPropertyBindingPrivate *QPropertyBindingPrivate::currentlyEvaluatingBinding()
@@ -1486,4 +1490,17 @@ QPropertyBindingData *QBindingStorage::bindingData_helper(QUntypedPropertyData *
return QBindingStoragePrivate(d).get(data, create);
}
+
+BindingEvaluationState *suspendCurrentBindingStatus()
+{
+ auto ret = bindingStatus.currentlyEvaluatingBinding;
+ bindingStatus.currentlyEvaluatingBinding = nullptr;
+ return ret;
+}
+
+void restoreBindingStatus(BindingEvaluationState *status)
+{
+ bindingStatus.currentlyEvaluatingBinding = status;
+}
+
QT_END_NAMESPACE