diff options
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qcore_mac_objc.mm | 5 | ||||
-rw-r--r-- | src/corelib/kernel/qcore_mac_p.h | 10 | ||||
-rw-r--r-- | src/corelib/kernel/qeventdispatcher_winrt_p.h | 2 | ||||
-rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 2 | ||||
-rw-r--r-- | src/corelib/kernel/qmetaobjectbuilder.cpp | 12 | ||||
-rw-r--r-- | src/corelib/kernel/qmetatype.h | 2 | ||||
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 28 | ||||
-rw-r--r-- | src/corelib/kernel/qobject_p.h | 9 | ||||
-rw-r--r-- | src/corelib/kernel/qobjectdefs.h | 37 | ||||
-rw-r--r-- | src/corelib/kernel/qsignalmapper.cpp | 8 | ||||
-rw-r--r-- | src/corelib/kernel/qsignalmapper.h | 6 | ||||
-rw-r--r-- | src/corelib/kernel/qtranslator.cpp | 3 | ||||
-rw-r--r-- | src/corelib/kernel/qvariant.h | 2 |
13 files changed, 79 insertions, 47 deletions
diff --git a/src/corelib/kernel/qcore_mac_objc.mm b/src/corelib/kernel/qcore_mac_objc.mm index 15b69acbd4..9e9e71c397 100644 --- a/src/corelib/kernel/qcore_mac_objc.mm +++ b/src/corelib/kernel/qcore_mac_objc.mm @@ -514,10 +514,9 @@ Q_CONSTRUCTOR_FUNCTION(qt_apple_check_os_version); // ------------------------------------------------------------------------- -void QMacKeyValueObserver::addObserver() +void QMacKeyValueObserver::addObserver(NSKeyValueObservingOptions options) { - [object addObserver:observer forKeyPath:keyPath - options:NSKeyValueObservingOptionNew context:callback.get()]; + [object addObserver:observer forKeyPath:keyPath options:options context:callback.get()]; } void QMacKeyValueObserver::removeObserver() { diff --git a/src/corelib/kernel/qcore_mac_p.h b/src/corelib/kernel/qcore_mac_p.h index 0e1a5fe345..447dcd9cbe 100644 --- a/src/corelib/kernel/qcore_mac_p.h +++ b/src/corelib/kernel/qcore_mac_p.h @@ -350,8 +350,12 @@ public: QMacKeyValueObserver() {} // Note: QMacKeyValueObserver must not outlive the object observed! - QMacKeyValueObserver(id object, NSString *keyPath, Callback callback) - : object(object), keyPath(keyPath), callback(new Callback(callback)) { addObserver(); } + QMacKeyValueObserver(id object, NSString *keyPath, Callback callback, + NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew) + : object(object), keyPath(keyPath), callback(new Callback(callback)) + { + addObserver(options); + } QMacKeyValueObserver(const QMacKeyValueObserver &other) : QMacKeyValueObserver(other.object, other.keyPath, *other.callback.get()) {} @@ -381,7 +385,7 @@ private: std::swap(first.callback, second.callback); } - void addObserver(); + void addObserver(NSKeyValueObservingOptions options); id object = nil; NSString *keyPath = nullptr; diff --git a/src/corelib/kernel/qeventdispatcher_winrt_p.h b/src/corelib/kernel/qeventdispatcher_winrt_p.h index 8b998a7958..2672f11123 100644 --- a/src/corelib/kernel/qeventdispatcher_winrt_p.h +++ b/src/corelib/kernel/qeventdispatcher_winrt_p.h @@ -57,7 +57,7 @@ #include <qt_windows.h> -namespace std { template <typename T> class function; } +#include <functional> QT_BEGIN_NAMESPACE diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index 56217262f2..acb1f54bdf 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -953,7 +953,7 @@ static const QMetaObject *QMetaObject_findMetaObject(const QMetaObject *self, co return self; if (self->d.relatedMetaObjects) { Q_ASSERT(priv(self->d.data)->revision >= 2); - const QMetaObject * const *e = self->d.relatedMetaObjects; + const auto *e = self->d.relatedMetaObjects; if (e) { while (*e) { if (const QMetaObject *m =QMetaObject_findMetaObject((*e), name)) diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp index d2030f0275..f77c4ce32f 100644 --- a/src/corelib/kernel/qmetaobjectbuilder.cpp +++ b/src/corelib/kernel/qmetaobjectbuilder.cpp @@ -747,7 +747,7 @@ void QMetaObjectBuilder::addMetaObject if ((members & RelatedMetaObjects) != 0) { Q_ASSERT(priv(prototype->d.data)->revision >= 2); - const QMetaObject * const *objects = prototype->d.relatedMetaObjects; + const auto *objects = prototype->d.relatedMetaObjects; if (objects) { while (*objects != 0) { addRelatedMetaObject(*objects); @@ -1464,16 +1464,16 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf, // Create the relatedMetaObjects block if we need one. if (d->relatedMetaObjects.size() > 0) { - ALIGN(size, QMetaObject *); - const QMetaObject **objects = - reinterpret_cast<const QMetaObject **>(buf + size); + using SuperData = QMetaObject::SuperData; + ALIGN(size, SuperData); + auto objects = reinterpret_cast<SuperData *>(buf + size); if (buf) { meta->d.relatedMetaObjects = objects; for (index = 0; index < d->relatedMetaObjects.size(); ++index) objects[index] = d->relatedMetaObjects[index]; - objects[index] = 0; + objects[index] = nullptr; } - size += sizeof(QMetaObject *) * (d->relatedMetaObjects.size() + 1); + size += sizeof(SuperData) * (d->relatedMetaObjects.size() + 1); } // Align the final size and return it. diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index a97764ede4..44cce73359 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -216,7 +216,7 @@ inline Q_DECL_CONSTEXPR int qMetaTypeId(); F(QQueue) \ F(QStack) \ F(QSet) \ - F(QLinkedList) + /*end*/ #define QT_FOR_EACH_AUTOMATIC_TEMPLATE_2ARG(F) \ F(QHash, class) \ diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 5c1ae8aa43..d364ae1087 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -93,12 +93,6 @@ QAbstractDynamicMetaObject::~QAbstractDynamicMetaObject() { } - -struct QSlotObjectBaseDeleter { // for use with QScopedPointer<QSlotObjectBase,...> - static void cleanup(QtPrivate::QSlotObjectBase *slot) { - if (slot) slot->destroyIfLastRef(); - } -}; static int *queuedConnectionTypes(const QList<QByteArray> &typeNames) { int *types = new int [typeNames.count() + 1]; @@ -3380,7 +3374,7 @@ QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender, type &= Qt::UniqueConnection - 1; } - QScopedPointer<QObjectPrivate::Connection> c(new QObjectPrivate::Connection); + std::unique_ptr<QObjectPrivate::Connection> c{new QObjectPrivate::Connection}; c->sender = s; c->signal_index = signal_index; c->receiver.storeRelaxed(r); @@ -3394,14 +3388,14 @@ QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender, c->argumentTypes.storeRelaxed(types); c->callFunction = callFunction; - QObjectPrivate::get(s)->addConnection(signal_index, c.data()); + QObjectPrivate::get(s)->addConnection(signal_index, c.get()); locker.unlock(); QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index); if (smethod.isValid()) s->connectNotify(smethod); - return c.take(); + return c.release(); } /*! @@ -3791,10 +3785,16 @@ void doActivate(QObject *sender, int signal_index, void **argv) if (c->isSlotObject) { c->slotObj->ref(); - QScopedPointer<QtPrivate::QSlotObjectBase, QSlotObjectBaseDeleter> obj(c->slotObj); + + struct Deleter { + void operator()(QtPrivate::QSlotObjectBase *slot) const { + if (slot) slot->destroyIfLastRef(); + } + }; + const std::unique_ptr<QtPrivate::QSlotObjectBase, Deleter> obj{c->slotObj}; { - Q_TRACE_SCOPE(QMetaObject_activate_slot_functor, obj.data()); + Q_TRACE_SCOPE(QMetaObject_activate_slot_functor, obj.get()); obj->call(receiver, argv); } } else if (c->callFunction && c->method_offset <= receiver->metaObject()->methodOffset()) { @@ -4947,7 +4947,7 @@ QMetaObject::Connection QObjectPrivate::connectImpl(const QObject *sender, int s type = static_cast<Qt::ConnectionType>(type ^ Qt::UniqueConnection); } - QScopedPointer<QObjectPrivate::Connection> c(new QObjectPrivate::Connection); + std::unique_ptr<QObjectPrivate::Connection> c{new QObjectPrivate::Connection}; c->sender = s; c->signal_index = signal_index; QThreadData *td = r->d_func()->threadData; @@ -4962,8 +4962,8 @@ QMetaObject::Connection QObjectPrivate::connectImpl(const QObject *sender, int s c->ownArgumentTypes = false; } - QObjectPrivate::get(s)->addConnection(signal_index, c.data()); - QMetaObject::Connection ret(c.take()); + QObjectPrivate::get(s)->addConnection(signal_index, c.get()); + QMetaObject::Connection ret(c.release()); locker.unlock(); QMetaMethod method = QMetaObjectPrivate::signal(senderMetaObject, signal_index); diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index 9cf1bfed08..95ffc1b2e8 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -486,8 +486,11 @@ class Q_CORE_EXPORT QAbstractMetaCallEvent : public QEvent { public: QAbstractMetaCallEvent(const QObject *sender, int signalId, QSemaphore *semaphore = nullptr) - : QEvent(MetaCall), signalId_(signalId), sender_(sender), semaphore_(semaphore) - {} + : QEvent(MetaCall), signalId_(signalId), sender_(sender) +#if QT_CONFIG(thread) + , semaphore_(semaphore) +#endif + { Q_UNUSED(semaphore); } ~QAbstractMetaCallEvent(); virtual void placeMetaCall(QObject *object) = 0; @@ -498,7 +501,9 @@ public: private: int signalId_; const QObject *sender_; +#if QT_CONFIG(thread) QSemaphore *semaphore_; +#endif }; class Q_CORE_EXPORT QMetaCallEvent : public QAbstractMetaCallEvent diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h index ef22b6e67f..dc2d832fe5 100644 --- a/src/corelib/kernel/qobjectdefs.h +++ b/src/corelib/kernel/qobjectdefs.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. -** Copyright (C) 2016 Intel Corporation. +** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2019 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -572,13 +572,42 @@ struct Q_CORE_EXPORT QMetaObject int static_metacall(Call, int, void **) const; static int metacall(QObject *, Call, int, void **); + template <const QMetaObject &MO> static constexpr const QMetaObject *staticMetaObject() + { + return &MO; + } + + struct SuperData { + const QMetaObject *direct; + SuperData() = default; + constexpr SuperData(std::nullptr_t) : direct(nullptr) {} + constexpr SuperData(const QMetaObject *mo) : direct(mo) {} + + constexpr const QMetaObject *operator->() const { return operator const QMetaObject *(); } + +#ifdef QT_NO_DATA_RELOCATION + using Getter = const QMetaObject *(*)(); + Getter indirect = nullptr; + constexpr SuperData(Getter g) : direct(nullptr), indirect(g) {} + constexpr operator const QMetaObject *() const + { return indirect ? indirect() : direct; } + template <const QMetaObject &MO> static constexpr SuperData link() + { return SuperData(QMetaObject::staticMetaObject<MO>); } +#else + constexpr operator const QMetaObject *() const + { return direct; } + template <const QMetaObject &MO> static constexpr SuperData link() + { return SuperData(QMetaObject::staticMetaObject<MO>()); } +#endif + }; + struct { // private data - const QMetaObject *superdata; + SuperData superdata; const QByteArrayData *stringdata; const uint *data; typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **); StaticMetacallFunction static_metacall; - const QMetaObject * const *relatedMetaObjects; + const SuperData *relatedMetaObjects; void *extradata; //reserved for future use } d; diff --git a/src/corelib/kernel/qsignalmapper.cpp b/src/corelib/kernel/qsignalmapper.cpp index 34fea861cd..24b174972f 100644 --- a/src/corelib/kernel/qsignalmapper.cpp +++ b/src/corelib/kernel/qsignalmapper.cpp @@ -38,7 +38,6 @@ ****************************************************************************/ #include "qglobal.h" -#if QT_DEPRECATED_SINCE(5, 10) #include "qsignalmapper.h" #include "qhash.h" @@ -64,7 +63,6 @@ public: /*! \class QSignalMapper \inmodule QtCore - \obsolete The recommended solution is connecting the signal to a lambda. \brief The QSignalMapper class bundles signals from identifiable senders. \ingroup objectmodel @@ -72,7 +70,9 @@ public: This class collects a set of parameterless signals, and re-emits them with integer, string or widget parameters corresponding to - the object that sent the signal. + the object that sent the signal. Note that in most cases you can + use lambdas for passing custom parameters to slots. This is less + costly and will simplify the code. The class supports the mapping of particular strings or integers with particular objects using setMapping(). The objects' signals @@ -314,5 +314,3 @@ void QSignalMapper::map(QObject *sender) QT_END_NAMESPACE #include "moc_qsignalmapper.cpp" - -#endif diff --git a/src/corelib/kernel/qsignalmapper.h b/src/corelib/kernel/qsignalmapper.h index 6c4cfa9627..0da1e8f87d 100644 --- a/src/corelib/kernel/qsignalmapper.h +++ b/src/corelib/kernel/qsignalmapper.h @@ -42,8 +42,6 @@ #include <QtCore/qobject.h> -#if QT_DEPRECATED_SINCE(5, 10) - QT_BEGIN_NAMESPACE class QSignalMapperPrivate; @@ -53,7 +51,7 @@ class Q_CORE_EXPORT QSignalMapper : public QObject Q_OBJECT Q_DECLARE_PRIVATE(QSignalMapper) public: - QT_DEPRECATED explicit QSignalMapper(QObject *parent = nullptr); + explicit QSignalMapper(QObject *parent = nullptr); ~QSignalMapper(); void setMapping(QObject *sender, int id); @@ -84,6 +82,4 @@ private: QT_END_NAMESPACE -#endif - #endif // QSIGNALMAPPER_H diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp index 637ef84d21..ddb96ecad6 100644 --- a/src/corelib/kernel/qtranslator.cpp +++ b/src/corelib/kernel/qtranslator.cpp @@ -528,7 +528,8 @@ bool QTranslatorPrivate::do_load(const QString &realname, const QString &directo // memory, so no need to use QFile to copy it again. Q_ASSERT(!d->resource); d->resource = new QResource(realname); - if (resource->isValid() && !resource->isCompressed() && resource->size() >= MagicLength + if (resource->isValid() && resource->compressionAlgorithm() == QResource::NoCompression + && resource->size() >= MagicLength && !memcmp(resource->data(), magic, MagicLength)) { d->unmapLength = resource->size(); d->unmapPointer = reinterpret_cast<char *>(const_cast<uchar *>(resource->data())); diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index c8cb551863..39b7e4c0ce 100644 --- a/src/corelib/kernel/qvariant.h +++ b/src/corelib/kernel/qvariant.h @@ -362,7 +362,7 @@ class Q_CORE_EXPORT QVariant static inline QVariant fromValue(const T &value) { return QVariant(qMetaTypeId<T>(), &value, QTypeInfo<T>::isPointer); } -#if QT_HAS_INCLUDE(<variant>) && __cplusplus >= 201703L +#if (QT_HAS_INCLUDE(<variant>) && __cplusplus >= 201703L) || defined(Q_CLANG_QDOC) template<typename... Types> static inline QVariant fromStdVariant(const std::variant<Types...> &value) { |