summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r--src/corelib/kernel/qobject.cpp18
-rw-r--r--src/corelib/kernel/qobject.h6
-rw-r--r--src/corelib/kernel/qobject_p.h1
-rw-r--r--src/corelib/kernel/qproperty.cpp11
-rw-r--r--src/corelib/kernel/qproperty.h41
-rw-r--r--src/corelib/kernel/qproperty_p.h6
-rw-r--r--src/corelib/kernel/qpropertyprivate.h1
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>