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;
333 const QtPrivate::BindingFunctionVTable *bindingFunctionVTable()
const {
return vtable; }
336 size_t dependencyObserverCount = 0;
338 bool isUpdating() {
return updating;}
339 void setSticky(
bool keep =
true) {m_sticky = keep;}
340 bool isSticky() {
return m_sticky;}
341 void scheduleNotify() {pendingNotify =
true;}
343 QPropertyBindingPrivate(QMetaType metaType,
const QtPrivate::BindingFunctionVTable *vtable,
344 const QPropertyBindingSourceLocation &location,
bool isQQmlPropertyBinding=
false)
345 : hasBindingWrapper(
false)
346 , isQQmlPropertyBinding(isQQmlPropertyBinding)
352 ~QPropertyBindingPrivate();
355 void setProperty(QUntypedPropertyData *propertyPtr) { propertyDataPtr = propertyPtr; }
356 void setStaticObserver(QtPrivate::QPropertyObserverCallback callback, QtPrivate::QPropertyBindingWrapper bindingWrapper)
358 Q_ASSERT(!(callback && bindingWrapper));
360 hasStaticObserver =
true;
361 hasBindingWrapper =
false;
362 staticObserverCallback = callback;
363 }
else if (bindingWrapper) {
364 hasStaticObserver =
false;
365 hasBindingWrapper =
true;
366 staticBindingWrapper = bindingWrapper;
368 hasStaticObserver =
false;
369 hasBindingWrapper =
false;
370 staticObserverCallback =
nullptr;
373 void prependObserver(QPropertyObserverPointer observer)
375 observer.ptr->prev =
const_cast<QPropertyObserver **>(&firstObserver.ptr);
376 firstObserver = observer;
379 QPropertyObserverPointer takeObservers()
381 auto observers = firstObserver;
382 firstObserver.ptr =
nullptr;
386 void clearDependencyObservers();
388 Q_ALWAYS_INLINE QPropertyObserverPointer allocateDependencyObserver() {
389 if (dependencyObserverCount < inlineDependencyObservers.size()) {
390 ++dependencyObserverCount;
391 return {&inlineDependencyObservers[dependencyObserverCount - 1]};
393 return allocateDependencyObserver_slow();
396 QPropertyObserverPointer allocateDependencyObserver_slow();
398 QPropertyBindingSourceLocation sourceLocation()
const
400 if (!isQQmlPropertyBinding)
403 constexpr auto msg =
"Custom location";
404 QPropertyBindingSourceLocation result;
405 result.fileName = msg;
409 QPropertyBindingError bindingError()
const {
return m_error; }
410 QMetaType valueMetaType()
const {
return metaType; }
412 void unlinkAndDeref();
414 bool evaluateRecursive(PendingBindingObserverList &bindingObservers, QBindingStatus *status =
nullptr);
416 Q_ALWAYS_INLINE
bool evaluateRecursive_inline(PendingBindingObserverList &bindingObservers, QBindingStatus *status);
418 void notifyNonRecursive(
const PendingBindingObserverList &bindingObservers);
419 enum NotificationState :
bool { Delayed, Sent };
420 NotificationState notifyNonRecursive();
422 static QPropertyBindingPrivate *get(
const QUntypedPropertyBinding &binding)
423 {
return static_cast<QPropertyBindingPrivate *>(binding.d.data()); }
424 static QUntypedPropertyBinding makeUntyped(QPropertyBindingPrivate *d)
425 {
return QUntypedPropertyBinding(
static_cast<
void *>(d)); }
427 void setError(QPropertyBindingError &&e)
428 { m_error = std::move(e); }
430 void detachFromProperty()
432 hasStaticObserver =
false;
433 hasBindingWrapper =
false;
434 propertyDataPtr =
nullptr;
435 clearDependencyObservers();
438 static QPropertyBindingPrivate *currentlyEvaluatingBinding();
441
442
443
444
445
446
447 bool hasCustomVTable()
const
449 return vtable->size == 0;
453
454
455 bool isQmlBinding()
const
457 return isQQmlPropertyBinding;
460 static void destroyAndFreeMemory(QPropertyBindingPrivate *priv) {
461 if (priv->hasCustomVTable()) {
464 priv->vtable->destroy(priv);
466 priv->~QPropertyBindingPrivate();
467 delete[]
reinterpret_cast<std::byte *>(priv);
474 if (
auto *b = binding()) {
475 b->firstObserver.ptr = observer;
478 auto &d = ptr->d_ref();
479 d =
reinterpret_cast<quintptr>(observer);
484 auto &d = ptr->d_ref();
485 if (ptr->isNotificationDelayed()) {
486 QPropertyProxyBindingData *proxy = ptr->proxyData();
488 proxy->originalBindingData = ptr;
493 if (d & QtPrivate::QPropertyBindingData::BindingBit)
495 if (
auto observer =
reinterpret_cast<QPropertyObserver *>(d))
496 observer->prev =
reinterpret_cast<QPropertyObserver **>(&d);
501 if (
auto *b = binding())
502 return b->firstObserver;
503 return {
reinterpret_cast<QPropertyObserver *>(ptr->d()) };
507
508
509
512 if (!ptr->isNotificationDelayed())
514 return ptr->proxyData();
530template<
typename Class,
typename T,
auto Offset,
auto Setter,
auto Signal =
nullptr,
531 auto Getter =
nullptr>
534 template<
typename Property,
typename>
538 using SignalTakesValue =
std::is_invocable<
decltype(Signal), Class, T>;
541 char *that =
reinterpret_cast<
char *>(
this);
542 return reinterpret_cast<Class *>(that - QtPrivate::detail::getOffset(Offset));
544 const Class *owner()
const
546 char *that =
const_cast<
char *>(
reinterpret_cast<
const char *>(
this));
547 return reinterpret_cast<Class *>(that - QtPrivate::detail::getOffset(Offset));
550 static bool bindingWrapper(QMetaType type, QUntypedPropertyData *dataPtr, QtPrivate::QPropertyBindingFunction binding)
552 auto *thisData =
static_cast<ThisType *>(dataPtr);
553 QBindingStorage *storage = qGetBindingStorage(thisData->owner());
557 if (!binding.vtable->call(type, ©, binding.functor))
562 (thisData->owner()->*Setter)(copy.valueBypassingBindings());
565 bool inBindingWrapper(
const QBindingStorage *storage)
const
567 return storage->bindingStatus && storage->bindingStatus->currentCompatProperty
568 && QtPrivate::isPropertyInBindingWrapper(
this);
571 inline static T getPropertyValue(
const QUntypedPropertyData *d) {
572 auto prop =
static_cast<
const ThisType *>(d);
573 if constexpr (
std::is_null_pointer_v<
decltype(Getter)>)
574 return prop->value();
576 return (prop->owner()->*Getter)();
579 inline static T getPropertyValueBypassingBindings(
const QUntypedPropertyData *d) {
580 auto prop =
static_cast<
const ThisType *>(d);
581 if constexpr (
std::is_null_pointer_v<
decltype(Getter)>)
582 return prop->valueBypassingBindings();
584 return (prop->owner()->*Getter)();
587 inline static void warnIfSignalWithArgumentAndCustomGetter()
589 if constexpr (!
std::is_null_pointer_v<
decltype(Signal)>
590 && SignalTakesValue::value
591 && !
std::is_null_pointer_v<
decltype(Getter)>) {
604 warnIfSignalWithArgumentAndCustomGetter();
608 warnIfSignalWithArgumentAndCustomGetter();
613 const QBindingStorage *storage = qGetBindingStorage(owner());
615 if (storage->bindingStatus && storage->bindingStatus->currentlyEvaluatingBinding && !inBindingWrapper(storage))
616 storage->registerDependency_helper(
this);
622 if constexpr (QTypeTraits::is_dereferenceable_v<T>) {
624 }
else if constexpr (
std::is_pointer_v<T>) {
644 QBindingStorage *storage = qGetBindingStorage(owner());
645 if (
auto *bd = storage->bindingData(
this)) {
647 if (bd->hasBinding() && !inBindingWrapper(storage))
648 bd->removeBinding_helper();
661 QtPrivate::QPropertyBindingData *bd = qGetBindingStorage(owner())->bindingData(
this,
true);
664 return static_cast<QPropertyBinding<T> &>(oldBinding);
669 if (!newBinding.isNull() && newBinding.valueMetaType() != QMetaType::fromType<T>())
676 template <
typename Functor>
679 std::enable_if_t<std::is_invocable_v<Functor>> * =
nullptr)
689 auto *bd = qGetBindingStorage(owner())->bindingData(
this);
690 return bd && bd->binding() !=
nullptr;
695 QBindingStorage *storage = qGetBindingStorage(owner());
696 if (
auto *bd = storage->bindingData(
this)) {
698 if (bd->hasBinding() && !inBindingWrapper(storage))
699 bd->removeBinding_helper();
705 QBindingStorage *storage = qGetBindingStorage(owner());
706 if (
auto bd = storage->bindingData(
this,
false)) {
710 if (!bd->isNotificationDelayed()) {
713 if (!inBindingWrapper(storage)) {
714 PendingBindingObserverList bindingObservers;
715 if (bd->notifyObserver_helper(
this, storage, observer, bindingObservers)
716 == QtPrivate::QPropertyBindingData::Evaluated) {
720 bd = storage->bindingData(
this,
false);
724 for (
auto&& bindingPtr: bindingObservers) {
725 auto *binding =
static_cast<QPropertyBindingPrivate *>(bindingPtr.get());
726 binding->notifyNonRecursive();
733 if constexpr (!
std::is_null_pointer_v<
decltype(Signal)>) {
734 if constexpr (SignalTakesValue::value)
735 (owner()->*Signal)(getPropertyValueBypassingBindings(
this));
737 (owner()->*Signal)();
743 auto *bd = qGetBindingStorage(owner())->bindingData(
this);
753 template<
typename Functor>
756 static_assert(
std::is_invocable_v<Functor>,
"Functor callback must be callable without any parameters");
760 template<
typename Functor>
763 static_assert(
std::is_invocable_v<Functor>,
"Functor callback must be callable without any parameters");
765 return onValueChanged(f);
768 template<
typename Functor>
771 static_assert(
std::is_invocable_v<Functor>,
"Functor callback must be callable without any parameters");
777 auto *storage =
const_cast<QBindingStorage *>(qGetBindingStorage(owner()));
810#define QT_OBJECT_COMPAT_PROPERTY_4(Class, Type, name, setter)
811 static constexpr size_t _qt_property_##name##_offset() {
812 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
813 return offsetof(Class, name);
816 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter> name;
818#define QT_OBJECT_COMPAT_PROPERTY_5(Class, Type, name, setter, signal)
819 static constexpr size_t _qt_property_##name##_offset() {
820 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
821 return offsetof(Class, name);
824 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter, signal> name;
826#define Q_OBJECT_COMPAT_PROPERTY(...)
827 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
828 QT_OVERLOADED_MACRO(QT_OBJECT_COMPAT_PROPERTY, __VA_ARGS__)
831#define QT_OBJECT_COMPAT_PROPERTY_WITH_ARGS_5(Class, Type, name, setter, value)
832 static constexpr size_t _qt_property_##name##_offset() {
833 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
834 return offsetof(Class, name);
837 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter> name =
838 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter>(
841#define QT_OBJECT_COMPAT_PROPERTY_WITH_ARGS_6(Class, Type, name, setter, signal, value)
842 static constexpr size_t _qt_property_##name##_offset() {
843 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
844 return offsetof(Class, name);
847 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter, signal> name =
848 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter,
851#define QT_OBJECT_COMPAT_PROPERTY_WITH_ARGS_7(Class, Type, name, setter, signal, getter, value)
852 static constexpr size_t _qt_property_##name##_offset() {
853 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
854 return offsetof(Class, name);
857 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter, signal, getter>
858 name = QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter,
859 signal, getter>(value);
861#define Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(...)
862 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
863 QT_OVERLOADED_MACRO(QT_OBJECT_COMPAT_PROPERTY_WITH_ARGS, __VA_ARGS__)
881 return bindable.data;
885inline bool QPropertyBindingPrivate::evaluateRecursive_inline(PendingBindingObserverList &bindingObservers, QBindingStatus *status)
888 m_error = QPropertyBindingError(QPropertyBindingError::BindingLoop);
889 if (isQQmlPropertyBinding)
895
896
897
898
899
900
901
902 QPropertyBindingPrivatePtr keepAlive {
this};
904 QScopedValueRollback<
bool> updateGuard(updating,
true);
906 QtPrivate::BindingEvaluationState evaluationFrame(
this, status);
908 auto bindingFunctor =
reinterpret_cast<std::byte *>(
this) +
909 QPropertyBindingPrivate::getSizeEnsuringAlignment();
910 bool changed =
false;
911 if (hasBindingWrapper) {
912 changed = staticBindingWrapper(metaType, propertyDataPtr,
913 {vtable, bindingFunctor});
915 changed = vtable->call(metaType, propertyDataPtr, bindingFunctor);
919 pendingNotify = pendingNotify || changed;
920 if (!changed || !firstObserver)
923 firstObserver.noSelfDependencies(
this);
924 firstObserver.evaluateBindings(bindingObservers, status);
929
930
931
932
933
934
935
938 auto observer =
const_cast<QPropertyObserver*>(
ptr);
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
957 QPropertyObserver *next = observer->next.data();
958 switch (QPropertyObserver::ObserverTag(observer->next.tag())) {
959 case QPropertyObserver::ObserverNotifiesChangeHandler:
961 auto handlerToCall = observer->changeHandler;
963 if (next && next->next.tag() == QPropertyObserver::ObserverIsPlaceholder) {
964 observer = next->next.data();
969 handlerToCall(observer, propertyDataPtr);
973 case QPropertyObserver::ObserverNotifiesBinding:
975 case QPropertyObserver::ObserverIsPlaceholder:
978#if QT_DEPRECATED_SINCE(6
, 6
)
979 QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
980 case QPropertyObserver::ObserverIsAlias:
984 default: Q_UNREACHABLE();
1007 QPropertyBindingPrivate *bindingPrivate = binding();
1008 if (!bindingPrivate->deref())
1009 QPropertyBindingPrivate::destroyAndFreeMemory(bindingPrivate);
1019 QPropertyBindingData bindingData_;
1021 QMetaProperty metaProperty_;
1023#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
1026 static void impl(QSlotObjectBase *this_, QObject *r,
void **a,
int which,
bool *ret);
1029 QPropertyAdaptorSlotObject(QObject *o,
const QMetaProperty& p);
1034 if (ptr->isImpl(&QPropertyAdaptorSlotObject::impl)) {
1036 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