diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index a3bc0ac0408..69f57efb46a 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -4057,24 +4057,6 @@ QList QObject::dynamicPropertyNames() const return QList(); } -/*! - \internal -*/ -QBindingStorage *QObject::bindingStorage() -{ - Q_D(QObject); - return &d->bindingStorage; -} - -/*! - \internal -*/ -const QBindingStorage *QObject::bindingStorage() const -{ - Q_D(const QObject); - return &d->bindingStorage; -} - #endif // QT_NO_PROPERTIES diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h index ca723730737..5742db1c22c 100644 --- a/src/corelib/kernel/qobject.h +++ b/src/corelib/kernel/qobject.h @@ -54,6 +54,7 @@ #include #include +#include #if __has_include() # include @@ -107,6 +108,7 @@ public: uint unused : 24; int postedEvents; QDynamicMetaObjectData *metaObject; + QBindingStorage bindingStorage; QMetaObject *dynamicMetaObject() const; #ifdef QT_DEBUG @@ -372,8 +374,8 @@ public: bool setProperty(const char *name, const QVariant &value); QVariant property(const char *name) const; QList dynamicPropertyNames() const; - QBindingStorage *bindingStorage(); - const QBindingStorage *bindingStorage() const; + QBindingStorage *bindingStorage() { return &d_ptr->bindingStorage; } + const QBindingStorage *bindingStorage() const { return &d_ptr->bindingStorage; } #endif // QT_NO_PROPERTIES Q_SIGNALS: diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index 79539fbd55f..a9626a8ab0f 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -384,7 +384,6 @@ public: // these objects are all used to indicate that a QObject was deleted // plus QPointer, which keeps a separate list QAtomicPointer sharedRefcount; - QBindingStorage bindingStorage; }; Q_DECLARE_TYPEINFO(QObjectPrivate::ConnectionList, Q_RELOCATABLE_TYPE); diff --git a/src/corelib/kernel/qproperty.cpp b/src/corelib/kernel/qproperty.cpp index 147103aed90..3eab02ac86c 100644 --- a/src/corelib/kernel/qproperty.cpp +++ b/src/corelib/kernel/qproperty.cpp @@ -1426,8 +1426,7 @@ struct QBindingStoragePrivate QPropertyBindingData *get(const QUntypedPropertyData *data) { - if (!d) - return nullptr; + Q_ASSERT(d); Q_ASSERT(d->size && (d->size & (d->size - 1)) == 0); // size is a power of two size_t index = qHash(data) & (d->size - 1); Pair *p = pairs(d); @@ -1497,13 +1496,13 @@ QBindingStorage::~QBindingStorage() QBindingStoragePrivate(d).destroy(); } -void QBindingStorage::maybeUpdateBindingAndRegister(const QUntypedPropertyData *data) const +void QBindingStorage::maybeUpdateBindingAndRegister_helper(const QUntypedPropertyData *data) const { Q_ASSERT(bindingStatus); QUntypedPropertyData *dd = const_cast(data); auto storage = bindingStatus->currentlyEvaluatingBinding ? QBindingStoragePrivate(d).getAndCreate(dd) : - QBindingStoragePrivate(d).get(dd); + (d ? QBindingStoragePrivate(d).get(dd) : nullptr); if (!storage) return; if (auto *binding = storage->binding()) @@ -1511,12 +1510,12 @@ void QBindingStorage::maybeUpdateBindingAndRegister(const QUntypedPropertyData * storage->registerWithCurrentlyEvaluatingBinding(); } -QPropertyBindingData *QBindingStorage::bindingData(const QUntypedPropertyData *data) const +QPropertyBindingData *QBindingStorage::bindingData_helper(const QUntypedPropertyData *data) const { return QBindingStoragePrivate(d).get(data); } -QPropertyBindingData *QBindingStorage::bindingData(QUntypedPropertyData *data, bool create) +QPropertyBindingData *QBindingStorage::bindingData_helper(QUntypedPropertyData *data, bool create) { auto storage = create ? QBindingStoragePrivate(d).getAndCreate(data) : diff --git a/src/corelib/kernel/qproperty.h b/src/corelib/kernel/qproperty.h index d612486e2c1..858724c0b7d 100644 --- a/src/corelib/kernel/qproperty.h +++ b/src/corelib/kernel/qproperty.h @@ -41,8 +41,8 @@ #define QPROPERTY_H #include -#include -#include +#include +#include #include #include #include @@ -774,7 +774,17 @@ public: } }; -struct QBindingStatus; +namespace QtPrivate { + +struct BindingEvaluationState; +struct CurrentCompatProperty; +} + +struct QBindingStatus +{ + QtPrivate::BindingEvaluationState *currentlyEvaluatingBinding = nullptr; + QtPrivate::CurrentCompatProperty *currentCompatProperty = nullptr; +}; struct QBindingStorageData; class Q_CORE_EXPORT QBindingStorage @@ -790,9 +800,28 @@ public: bool isEmpty() { return !d; } - void maybeUpdateBindingAndRegister(const QUntypedPropertyData *data) const; - QtPrivate::QPropertyBindingData *bindingData(const QUntypedPropertyData *data) const; - QtPrivate::QPropertyBindingData *bindingData(QUntypedPropertyData *data, bool create); + void maybeUpdateBindingAndRegister(const QUntypedPropertyData *data) const + { + if (!d && !bindingStatus->currentlyEvaluatingBinding) + return; + maybeUpdateBindingAndRegister_helper(data); + } + QtPrivate::QPropertyBindingData *bindingData(const QUntypedPropertyData *data) const + { + if (!d) + return nullptr; + return bindingData_helper(data); + } + QtPrivate::QPropertyBindingData *bindingData(QUntypedPropertyData *data, bool create) + { + if (!d && !create) + return nullptr; + return bindingData_helper(data, create); + } +private: + void maybeUpdateBindingAndRegister_helper(const QUntypedPropertyData *data) const; + QtPrivate::QPropertyBindingData *bindingData_helper(const QUntypedPropertyData *data) const; + QtPrivate::QPropertyBindingData *bindingData_helper(QUntypedPropertyData *data, bool create); }; diff --git a/src/corelib/kernel/qproperty_p.h b/src/corelib/kernel/qproperty_p.h index 9a0daaee3a2..8f6577a2de4 100644 --- a/src/corelib/kernel/qproperty_p.h +++ b/src/corelib/kernel/qproperty_p.h @@ -148,12 +148,6 @@ struct CurrentCompatProperty } -struct QBindingStatus -{ - QtPrivate::BindingEvaluationState *currentlyEvaluatingBinding = nullptr; - QtPrivate::CurrentCompatProperty *currentCompatProperty = nullptr; -}; - class Q_CORE_EXPORT QPropertyBindingPrivate : public QtPrivate::RefCounted { private: diff --git a/src/corelib/kernel/qpropertyprivate.h b/src/corelib/kernel/qpropertyprivate.h index 6bac03243bd..0edfe5781b7 100644 --- a/src/corelib/kernel/qpropertyprivate.h +++ b/src/corelib/kernel/qpropertyprivate.h @@ -52,7 +52,6 @@ // #include -#include #include #include diff --git a/tests/auto/other/toolsupport/tst_toolsupport.cpp b/tests/auto/other/toolsupport/tst_toolsupport.cpp index 7acf1ad08d6..bd6cc8b2938 100644 --- a/tests/auto/other/toolsupport/tst_toolsupport.cpp +++ b/tests/auto/other/toolsupport/tst_toolsupport.cpp @@ -97,14 +97,14 @@ void tst_toolsupport::offsets_data() { QTestData &data = QTest::newRow("sizeof(QObjectData)") << sizeof(QObjectData); - data << 36 << 64; // vptr + 2 ptr + (2*ptr + int) + 2 int + ptr + data << 44 << 80; // vptr + 2 ptr + (2*ptr + int) + 2 int + ptr } #if RUN_MEMBER_OFFSET_TEST { QTestData &data = QTest::newRow("QObjectPrivate::extraData") << pmm_to_offsetof(&QObjectPrivate::extraData); - data << 36 << 64; // sizeof(QObjectData) + data << 44 << 80; // sizeof(QObjectData) } {