19#include <private/qglobal_p.h>
22#include <qmetaobject.h>
23#include <qscopedvaluerollback.h>
26#include <QtCore/QVarLengthArray>
43
44
45
46
47
51 QPropertyObserver *d =
nullptr;
64 inline QPropertyObserver *
operator ->();
67using PendingBindingObserverList = QVarLengthArray<QPropertyBindingPrivatePtr>;
79 return ptr->binding();
84 auto &d = ptr->d_ref();
85 observer->prev =
reinterpret_cast<QPropertyObserver**>(&d);
86 d =
reinterpret_cast<quintptr>(observer);
121 QPropertyObserver *
next()
const {
return m_placeHolder.next.data(); }
129 QPropertyObserver *
ptr =
nullptr;
134#if QT_DEPRECATED_SINCE(6
, 6
)
135 QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
136 if (ptr->next.tag() == QPropertyObserver::ObserverIsAlias)
137 ptr->aliasData =
nullptr;
144#if QT_DEPRECATED_SINCE(6
, 6
)
145 QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
146 Q_ASSERT(ptr->next.tag() != QPropertyObserver::ObserverIsAlias);
154 Q_ASSERT(ptr->next.tag() != QPropertyObserver::ObserverIsPlaceholder);
155 ptr->binding = binding;
156 ptr->next.setTag(QPropertyObserver::ObserverNotifiesBinding);
164 void notify(QUntypedPropertyData *propertyDataPtr);
170 void evaluateBindings(PendingBindingObserverList &bindingObservers, QBindingStatus *status);
179 Q_ASSERT(ptr->next.tag() == QPropertyObserver::ObserverNotifiesBinding);
187 ptr->next->prev =
ptr->prev;
189 ptr->prev.setPointer(
ptr->next.data());
219
220
221
222
223
224
241
242
243
244
245
246
264 friend struct QPropertyBindingDataPointer;
265 friend class QPropertyBindingPrivatePtr;
267 using ObserverArray = std::array<QPropertyObserver, 4>;
272 bool updating =
false;
273 bool hasStaticObserver =
false;
274 bool pendingNotify =
false;
275 bool hasBindingWrapper:1;
277 bool isQQmlPropertyBinding:1;
279
280
281
284 const QtPrivate::BindingFunctionVTable *vtable;
287 QtPrivate::QPropertyObserverCallback staticObserverCallback =
nullptr;
288 QtPrivate::QPropertyBindingWrapper staticBindingWrapper;
290 ObserverArray inlineDependencyObservers;
292 QPropertyObserverPointer firstObserver;
293 std::unique_ptr<std::vector<QPropertyObserver>> heapObservers;
296 QUntypedPropertyData *propertyDataPtr =
nullptr;
299
300
301
302
303
304
305
306
307
308
309
310
311 using DeclarativeErrorCallback =
void(*)(QPropertyBindingPrivate *);
313 QPropertyBindingSourceLocation location;
315 std::byte declarativeExtraData[
sizeof(QPropertyBindingSourceLocation) -
sizeof(DeclarativeErrorCallback)];
316 DeclarativeErrorCallback errorCallBack;
320 QPropertyBindingError m_error;
325 static constexpr size_t getSizeEnsuringAlignment() {
326 constexpr auto align =
alignof (std::max_align_t) - 1;
327 constexpr size_t sizeEnsuringAlignment = (
sizeof(QPropertyBindingPrivate) + align) & ~align;
328 static_assert (sizeEnsuringAlignment %
alignof (std::max_align_t) == 0,
329 "Required for placement new'ing the function behind it.");
330 return sizeEnsuringAlignment;
335 size_t dependencyObserverCount = 0;
337 bool isUpdating() {
return updating;}
338 void setSticky(
bool keep =
true) {m_sticky = keep;}
339 bool isSticky() {
return m_sticky;}
340 void scheduleNotify() {pendingNotify =
true;}
342 QPropertyBindingPrivate(QMetaType metaType,
const QtPrivate::BindingFunctionVTable *vtable,
343 const QPropertyBindingSourceLocation &location,
bool isQQmlPropertyBinding=
false)
344 : hasBindingWrapper(
false)
345 , isQQmlPropertyBinding(isQQmlPropertyBinding)
351 ~QPropertyBindingPrivate();
354 void setProperty(QUntypedPropertyData *propertyPtr) { propertyDataPtr = propertyPtr; }
355 void setStaticObserver(QtPrivate::QPropertyObserverCallback callback, QtPrivate::QPropertyBindingWrapper bindingWrapper)
357 Q_ASSERT(!(callback && bindingWrapper));
359 hasStaticObserver =
true;
360 hasBindingWrapper =
false;
361 staticObserverCallback = callback;
362 }
else if (bindingWrapper) {
363 hasStaticObserver =
false;
364 hasBindingWrapper =
true;
365 staticBindingWrapper = bindingWrapper;
367 hasStaticObserver =
false;
368 hasBindingWrapper =
false;
369 staticObserverCallback =
nullptr;
372 void prependObserver(QPropertyObserverPointer observer)
374 observer.ptr->prev =
const_cast<QPropertyObserver **>(&firstObserver.ptr);
375 firstObserver = observer;
378 QPropertyObserverPointer takeObservers()
380 auto observers = firstObserver;
381 firstObserver.ptr =
nullptr;
385 void clearDependencyObservers();
387 Q_ALWAYS_INLINE QPropertyObserverPointer allocateDependencyObserver() {
388 if (dependencyObserverCount < inlineDependencyObservers.size()) {
389 ++dependencyObserverCount;
390 return {&inlineDependencyObservers[dependencyObserverCount - 1]};
392 return allocateDependencyObserver_slow();
395 QPropertyObserverPointer allocateDependencyObserver_slow();
397 QPropertyBindingSourceLocation sourceLocation()
const
399 if (!isQQmlPropertyBinding)
402 constexpr auto msg =
"Custom location";
403 QPropertyBindingSourceLocation result;
404 result.fileName = msg;
408 QPropertyBindingError bindingError()
const {
return m_error; }
409 QMetaType valueMetaType()
const {
return metaType; }
411 void unlinkAndDeref();
413 bool evaluateRecursive(PendingBindingObserverList &bindingObservers, QBindingStatus *status =
nullptr);
415 Q_ALWAYS_INLINE
bool evaluateRecursive_inline(PendingBindingObserverList &bindingObservers, QBindingStatus *status);
417 void notifyNonRecursive(
const PendingBindingObserverList &bindingObservers);
418 enum NotificationState :
bool { Delayed, Sent };
419 NotificationState notifyNonRecursive();
421 static QPropertyBindingPrivate *get(
const QUntypedPropertyBinding &binding)
422 {
return static_cast<QPropertyBindingPrivate *>(binding.d.data()); }
423 static QUntypedPropertyBinding makeUntyped(QPropertyBindingPrivate *d)
424 {
return QUntypedPropertyBinding(
static_cast<
void *>(d)); }
426 void setError(QPropertyBindingError &&e)
427 { m_error = std::move(e); }
429 void detachFromProperty()
431 hasStaticObserver =
false;
432 hasBindingWrapper =
false;
433 propertyDataPtr =
nullptr;
434 clearDependencyObservers();
437 static QPropertyBindingPrivate *currentlyEvaluatingBinding();
440
441
442
443
444
445
446 bool hasCustomVTable()
const
448 return vtable->size == 0;
452
453
454 bool isQmlBinding()
const
456 return isQQmlPropertyBinding;
459 static void destroyAndFreeMemory(QPropertyBindingPrivate *priv) {
460 if (priv->hasCustomVTable()) {
463 priv->vtable->destroy(priv);
465 priv->~QPropertyBindingPrivate();
466 delete[]
reinterpret_cast<std::byte *>(priv);
473 if (
auto *b = binding()) {
474 b->firstObserver.ptr = observer;
477 auto &d = ptr->d_ref();
478 d =
reinterpret_cast<quintptr>(observer);
483 auto &d = ptr->d_ref();
484 if (ptr->isNotificationDelayed()) {
485 QPropertyProxyBindingData *proxy = ptr->proxyData();
487 proxy->originalBindingData = ptr;
492 if (d & QtPrivate::QPropertyBindingData::BindingBit)
494 if (
auto observer =
reinterpret_cast<QPropertyObserver *>(d))
495 observer->prev =
reinterpret_cast<QPropertyObserver **>(&d);
500 if (
auto *b = binding())
501 return b->firstObserver;
502 return {
reinterpret_cast<QPropertyObserver *>(ptr->d()) };
506
507
508
511 if (!ptr->isNotificationDelayed())
513 return ptr->proxyData();
529template<
typename Class,
typename T,
auto Offset,
auto Setter,
auto Signal =
nullptr,
530 auto Getter =
nullptr>
533 template<
typename Property,
typename>
537 using SignalTakesValue =
std::is_invocable<
decltype(Signal), Class, T>;
540 char *that =
reinterpret_cast<
char *>(
this);
541 return reinterpret_cast<Class *>(that - QtPrivate::detail::getOffset(Offset));
543 const Class *owner()
const
545 char *that =
const_cast<
char *>(
reinterpret_cast<
const char *>(
this));
546 return reinterpret_cast<Class *>(that - QtPrivate::detail::getOffset(Offset));
549 static bool bindingWrapper(QMetaType type, QUntypedPropertyData *dataPtr, QtPrivate::QPropertyBindingFunction binding)
551 auto *thisData =
static_cast<ThisType *>(dataPtr);
552 QBindingStorage *storage = qGetBindingStorage(thisData->owner());
556 if (!binding.vtable->call(type, ©, binding.functor))
561 (thisData->owner()->*Setter)(copy.valueBypassingBindings());
564 bool inBindingWrapper(
const QBindingStorage *storage)
const
566 return storage->bindingStatus && storage->bindingStatus->currentCompatProperty
567 && QtPrivate::isPropertyInBindingWrapper(
this);
570 inline static T getPropertyValue(
const QUntypedPropertyData *d) {
571 auto prop =
static_cast<
const ThisType *>(d);
572 if constexpr (
std::is_null_pointer_v<
decltype(Getter)>)
573 return prop->value();
575 return (prop->owner()->*Getter)();
578 inline static T getPropertyValueBypassingBindings(
const QUntypedPropertyData *d) {
579 auto prop =
static_cast<
const ThisType *>(d);
580 if constexpr (
std::is_null_pointer_v<
decltype(Getter)>)
581 return prop->valueBypassingBindings();
583 return (prop->owner()->*Getter)();
586 inline static void warnIfSignalWithArgumentAndCustomGetter()
588 if constexpr (!
std::is_null_pointer_v<
decltype(Signal)>
589 && SignalTakesValue::value
590 && !
std::is_null_pointer_v<
decltype(Getter)>) {
603 warnIfSignalWithArgumentAndCustomGetter();
607 warnIfSignalWithArgumentAndCustomGetter();
612 const QBindingStorage *storage = qGetBindingStorage(owner());
614 if (storage->bindingStatus && storage->bindingStatus->currentlyEvaluatingBinding && !inBindingWrapper(storage))
615 storage->registerDependency_helper(
this);
621 if constexpr (QTypeTraits::is_dereferenceable_v<T>) {
623 }
else if constexpr (
std::is_pointer_v<T>) {
643 QBindingStorage *storage = qGetBindingStorage(owner());
644 if (
auto *bd = storage->bindingData(
this)) {
646 if (bd->hasBinding() && !inBindingWrapper(storage))
647 bd->removeBinding_helper();
660 QtPrivate::QPropertyBindingData *bd = qGetBindingStorage(owner())->bindingData(
this,
true);
663 return static_cast<QPropertyBinding<T> &>(oldBinding);
668 if (!newBinding.isNull() && newBinding.valueMetaType() != QMetaType::fromType<T>())
675 template <
typename Functor>
678 std::enable_if_t<std::is_invocable_v<Functor>> * =
nullptr)
688 auto *bd = qGetBindingStorage(owner())->bindingData(
this);
689 return bd && bd->binding() !=
nullptr;
694 QBindingStorage *storage = qGetBindingStorage(owner());
695 if (
auto *bd = storage->bindingData(
this)) {
697 if (bd->hasBinding() && !inBindingWrapper(storage))
698 bd->removeBinding_helper();
704 QBindingStorage *storage = qGetBindingStorage(owner());
705 if (
auto bd = storage->bindingData(
this,
false)) {
709 if (!bd->isNotificationDelayed()) {
712 if (!inBindingWrapper(storage)) {
713 PendingBindingObserverList bindingObservers;
714 if (bd->notifyObserver_helper(
this, storage, observer, bindingObservers)
715 == QtPrivate::QPropertyBindingData::Evaluated) {
719 bd = storage->bindingData(
this,
false);
723 for (
auto&& bindingPtr: bindingObservers) {
724 auto *binding =
static_cast<QPropertyBindingPrivate *>(bindingPtr.get());
725 binding->notifyNonRecursive();
732 if constexpr (!
std::is_null_pointer_v<
decltype(Signal)>) {
733 if constexpr (SignalTakesValue::value)
734 (owner()->*Signal)(getPropertyValueBypassingBindings(
this));
736 (owner()->*Signal)();
742 auto *bd = qGetBindingStorage(owner())->bindingData(
this);
752 template<
typename Functor>
755 static_assert(
std::is_invocable_v<Functor>,
"Functor callback must be callable without any parameters");
759 template<
typename Functor>
762 static_assert(
std::is_invocable_v<Functor>,
"Functor callback must be callable without any parameters");
764 return onValueChanged(f);
767 template<
typename Functor>
770 static_assert(
std::is_invocable_v<Functor>,
"Functor callback must be callable without any parameters");
776 auto *storage =
const_cast<QBindingStorage *>(qGetBindingStorage(owner()));
809#define QT_OBJECT_COMPAT_PROPERTY_4(Class, Type, name, setter)
810 static constexpr size_t _qt_property_##name##_offset() {
811 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
812 return offsetof(Class, name);
815 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter> name;
817#define QT_OBJECT_COMPAT_PROPERTY_5(Class, Type, name, setter, signal)
818 static constexpr size_t _qt_property_##name##_offset() {
819 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
820 return offsetof(Class, name);
823 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter, signal> name;
825#define Q_OBJECT_COMPAT_PROPERTY(...)
826 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
827 QT_OVERLOADED_MACRO(QT_OBJECT_COMPAT_PROPERTY, __VA_ARGS__)
830#define QT_OBJECT_COMPAT_PROPERTY_WITH_ARGS_5(Class, Type, name, setter, value)
831 static constexpr size_t _qt_property_##name##_offset() {
832 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
833 return offsetof(Class, name);
836 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter> name =
837 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter>(
840#define QT_OBJECT_COMPAT_PROPERTY_WITH_ARGS_6(Class, Type, name, setter, signal, value)
841 static constexpr size_t _qt_property_##name##_offset() {
842 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
843 return offsetof(Class, name);
846 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter, signal> name =
847 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter,
850#define QT_OBJECT_COMPAT_PROPERTY_WITH_ARGS_7(Class, Type, name, setter, signal, getter, value)
851 static constexpr size_t _qt_property_##name##_offset() {
852 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
853 return offsetof(Class, name);
856 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter, signal, getter>
857 name = QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter,
858 signal, getter>(value);
860#define Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(...)
861 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
862 QT_OVERLOADED_MACRO(QT_OBJECT_COMPAT_PROPERTY_WITH_ARGS, __VA_ARGS__)
880 return bindable.data;
884inline bool QPropertyBindingPrivate::evaluateRecursive_inline(PendingBindingObserverList &bindingObservers, QBindingStatus *status)
887 m_error = QPropertyBindingError(QPropertyBindingError::BindingLoop);
888 if (isQQmlPropertyBinding)
894
895
896
897
898
899
900
901 QPropertyBindingPrivatePtr keepAlive {
this};
903 QScopedValueRollback<
bool> updateGuard(updating,
true);
905 QtPrivate::BindingEvaluationState evaluationFrame(
this, status);
907 auto bindingFunctor =
reinterpret_cast<std::byte *>(
this) +
908 QPropertyBindingPrivate::getSizeEnsuringAlignment();
909 bool changed =
false;
910 if (hasBindingWrapper) {
911 changed = staticBindingWrapper(metaType, propertyDataPtr,
912 {vtable, bindingFunctor});
914 changed = vtable->call(metaType, propertyDataPtr, bindingFunctor);
918 pendingNotify = pendingNotify || changed;
919 if (!changed || !firstObserver)
922 firstObserver.noSelfDependencies(
this);
923 firstObserver.evaluateBindings(bindingObservers, status);
928
929
930
931
932
933
934
937 auto observer =
const_cast<QPropertyObserver*>(
ptr);
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
956 QPropertyObserver *next = observer->next.data();
957 switch (QPropertyObserver::ObserverTag(observer->next.tag())) {
958 case QPropertyObserver::ObserverNotifiesChangeHandler:
960 auto handlerToCall = observer->changeHandler;
962 if (next && next->next.tag() == QPropertyObserver::ObserverIsPlaceholder) {
963 observer = next->next.data();
968 handlerToCall(observer, propertyDataPtr);
972 case QPropertyObserver::ObserverNotifiesBinding:
974 case QPropertyObserver::ObserverIsPlaceholder:
977#if QT_DEPRECATED_SINCE(6
, 6
)
978 QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
979 case QPropertyObserver::ObserverIsAlias:
983 default: Q_UNREACHABLE();
1006 QPropertyBindingPrivate *bindingPrivate = binding();
1007 if (!bindingPrivate->deref())
1008 QPropertyBindingPrivate::destroyAndFreeMemory(bindingPrivate);
1018 QPropertyBindingData bindingData_;
1020 QMetaProperty metaProperty_;
1022#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
1025 static void impl(QSlotObjectBase *this_, QObject *r,
void **a,
int which,
bool *ret);
1028 QPropertyAdaptorSlotObject(QObject *o,
const QMetaProperty& p);
1033 if (ptr->isImpl(&QPropertyAdaptorSlotObject::impl)) {
1035 if (p->metaProperty_.propertyIndex() == propertyIndex)
\macro Q_OBJECT_BINDABLE_PROPERTY(containingClass, type, name, signal)
QPropertyBinding< T > binding() const
operator parameter_type() const
typename QPropertyData< T >::value_type value_type
QtPrivate::QPropertyBindingData & bindingData() const
QObjectCompatProperty & operator=(parameter_type newValue)
typename QPropertyData< T >::arrow_operator_result arrow_operator_result
typename QPropertyData< T >::parameter_type parameter_type
parameter_type value() const
QPropertyChangeHandler< Functor > onValueChanged(Functor f)
void setValue(parameter_type t)
void removeBindingUnlessInWrapper()
bool setBinding(const QUntypedPropertyBinding &newBinding)
QPropertyBinding< T > setBinding(Functor &&f, const QPropertyBindingSourceLocation &location=QT_PROPERTY_DEFAULT_BINDING_LOCATION, std::enable_if_t< std::is_invocable_v< Functor > > *=nullptr)
arrow_operator_result operator->() const
QObjectCompatProperty(T &&initialValue)
QPropertyNotifier addNotifier(Functor f)
parameter_type operator*() const
QObjectCompatProperty(const T &initialValue)
QPropertyBinding< T > takeBinding()
QPropertyChangeHandler< Functor > subscribe(Functor f)
QPropertyBinding< T > setBinding(const QPropertyBinding< T > &newBinding)
~QTimerPrivate() override
QTimerPrivate(QTimer *qq)
void setIntervalDuration(std::chrono::nanoseconds nsec)
static constexpr int INV_TIMER
void setInterval(int msec)
QTimerPrivate(std::chrono::nanoseconds nsec, QChronoTimer *qq)
const QtPrivate::QBindableInterface * iface
QPrivateSlotObject(Func f)
QPropertyBindingData & bindingData()
friend class QT_PREPEND_NAMESPACE(QUntypedBindable)
const QMetaProperty & metaProperty() const
static QPropertyAdaptorSlotObject * cast(QSlotObjectBase *ptr, int propertyIndex)
const QPropertyBindingData & bindingData() const
Combined button and popup list for selecting options.
Q_CORE_EXPORT void printSignalArgumentsWithCustomGetter()
void assertObjectType(QObjectPrivate *d)
Q_CORE_EXPORT bool isAnyBindingEvaluating()
Q_CORE_EXPORT void restoreBindingStatus(BindingEvaluationState *status)
const QObject * getQObject(const QObjectPrivate *d)
Q_CORE_EXPORT bool isPropertyInBindingWrapper(const QUntypedPropertyData *property)
#define QT_CONCAT(B, M, m, u)
QBindingStorage * qGetBindingStorage(QObjectPrivate *o)
QBindingStorage * qGetBindingStorage(QObjectPrivate::ExtraData *ed)
const QBindingStorage * qGetBindingStorage(const QObjectPrivate *o)
#define Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(...)
#define QT_PROPERTY_DEFAULT_BINDING_LOCATION
#define Q_OBJECT_COMPUTED_PROPERTY(Class, Type, name, ...)
#define Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(...)
QBindingObserverPtr()=default
QPropertyObserver * operator->()
QPropertyBindingPrivate * binding() const noexcept
static QPropertyProxyBindingData * proxyData(QtPrivate::QPropertyBindingData *ptr)
static void fixupAfterMove(QtPrivate::QPropertyBindingData *ptr)
Q_ALWAYS_INLINE void addObserver(QPropertyObserver *observer)
const QtPrivate::QPropertyBindingData * ptr
int observerCount() const
static QPropertyBindingDataPointer get(QProperty< T > &property)
QPropertyBindingPrivate * binding() const
void setObservers(QPropertyObserver *observer)
QPropertyObserverPointer firstObserver() const
void setFirstObserver(QPropertyObserver *observer)
~QPropertyObserverNodeProtector()
QPropertyObserver * next() const
void noSelfDependencies(QPropertyBindingPrivate *binding)
void notify(QUntypedPropertyData *propertyDataPtr)
QPropertyBindingPrivate * binding() const
void evaluateBindings(PendingBindingObserverList &bindingObservers, QBindingStatus *status)
void observeProperty(QPropertyBindingDataPointer property)
QPropertyObserverPointer nextObserver() const
void setBindingToNotify_unsafe(QPropertyBindingPrivate *binding)
void setChangeHandler(QPropertyObserver::ChangeHandler changeHandler)
void setBindingToNotify(QPropertyBindingPrivate *binding)
void(* BeginCallback)(QObject *caller, int signal_or_method_index, void **argv)
BeginCallback slot_begin_callback
EndCallback slot_end_callback
EndCallback signal_end_callback
BeginCallback signal_begin_callback
void(* EndCallback)(QObject *caller, int signal_or_method_index)
static QtPrivate::QBindableInterface const * getInterface(const QUntypedBindable &bindable)
static QUntypedPropertyData * getPropertyData(const QUntypedBindable &bindable)
QPropertyBindingPrivate * binding
QVarLengthArray< const QPropertyBindingData *, 8 > alreadyCaptureProperties
BindingEvaluationState(QPropertyBindingPrivate *binding, QBindingStatus *status)
BindingEvaluationState * previousState
~BindingEvaluationState()
BindingEvaluationState ** currentState
QtPrivate::BindingEvaluationState ** currentlyEvaluatingBindingList
CompatPropertySafePoint * previousState
CompatPropertySafePoint ** currentState
~CompatPropertySafePoint()
QUntypedPropertyData * property
QtPrivate::BindingEvaluationState * bindingState