diff options
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 18 | ||||
-rw-r--r-- | src/corelib/kernel/qobject.h | 6 | ||||
-rw-r--r-- | src/corelib/kernel/qobject_p.h | 1 | ||||
-rw-r--r-- | src/corelib/kernel/qproperty.cpp | 11 | ||||
-rw-r--r-- | src/corelib/kernel/qproperty.h | 41 | ||||
-rw-r--r-- | src/corelib/kernel/qproperty_p.h | 6 | ||||
-rw-r--r-- | src/corelib/kernel/qpropertyprivate.h | 1 |
7 files changed, 44 insertions, 40 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index a3bc0ac040..69f57efb46 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -4057,24 +4057,6 @@ QList<QByteArray> QObject::dynamicPropertyNames() const return QList<QByteArray>(); } -/*! - \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 ca72373073..5742db1c22 100644 --- a/src/corelib/kernel/qobject.h +++ b/src/corelib/kernel/qobject.h @@ -54,6 +54,7 @@ #include <QtCore/qmetatype.h> #include <QtCore/qobject_impl.h> +#include <QtCore/qproperty.h> #if __has_include(<chrono>) # include <chrono> @@ -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<QByteArray> 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 79539fbd55..a9626a8ab0 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<QtSharedPointer::ExternalRefCountData> 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 147103aed9..3eab02ac86 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<QUntypedPropertyData *>(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 d612486e2c..858724c0b7 100644 --- a/src/corelib/kernel/qproperty.h +++ b/src/corelib/kernel/qproperty.h @@ -41,8 +41,8 @@ #define QPROPERTY_H #include <QtCore/qglobal.h> -#include <QtCore/QSharedDataPointer> -#include <QtCore/QString> +#include <QtCore/qshareddata.h> +#include <QtCore/qstring.h> #include <functional> #include <type_traits> #include <variant> @@ -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 9a0daaee3a..8f6577a2de 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 6bac03243b..0edfe5781b 100644 --- a/src/corelib/kernel/qpropertyprivate.h +++ b/src/corelib/kernel/qpropertyprivate.h @@ -52,7 +52,6 @@ // #include <QtCore/qglobal.h> -#include <QtCore/QExplicitlySharedDataPointer> #include <QtCore/qtaggedpointer.h> #include <QtCore/qmetatype.h> |