summaryrefslogtreecommitdiff
path: root/src/corelib/kernel
Commit message (Collapse)AuthorAgeFilesLines
* QEventDispatcher/WASM: fix a lambda nameAhmad Samir2023-05-151-3/+3
| | | | | | | | | It's returning milliseconds not nanoseconds. Change-Id: I7dbc3f4043694b6ddf87c6ad9e4d20d3a9af0fd1 Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io> Reviewed-by: Marc Mutz <marc.mutz@qt.io> Reviewed-by: Mikołaj Boc <Mikolaj.Boc@qt.io>
* Darwin: Use direct runtime interface to manage autorelease poolsTor Arne Vestbø2023-05-151-5/+12
| | | | | | | | | | | | | | | | | | | | | | | | | The Objective-C runtime supports autorelease pools via a language specific ABI supplement, akin to the “Itanium” generic ABI for C++. https://clang.llvm.org/docs/AutomaticReferenceCounting.html#runtime-support These interfaces are used by NSAutoreleasePool internally, as well as inserted by the compiler when using the @autoreleasepool syntax in Objective-C code. We have our own wrapper, QMacAutoReleasePool, which allows us to set up pools in C++ code as well. We now use these lower level interfaces in the implementation, instead of NSAutoreleasePool, as this reduces overhead due to not needing to allocate and destroy a NSAutoreleasePool. This also opens up the possibility of using Automatic Reference Counting (ARC) in Qt down the road, as explicit NSAutoreleasePool usage is forbidden in that mode (while @autoreleasepool is not, and uses the runtime ABI internally as before). Change-Id: I06fdb4a24ae4972820f866e0a129a1b355bc8a6b Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
* Darwin: Disable QMacAutoReleasePool tracker unless explicitly enabledTor Arne Vestbø2023-05-151-0/+4
| | | | | | | | | | | | There's a few orders of magnitude of overhead using QMacAutoReleasePool with the tracker enabled, so disable it even for debug builds, unless explicit auto release pool debugging has been enabled via the environment variable QT_DARWIN_DEBUG_AUTORELEASEPOOLS. Pick-to: 6.5 Change-Id: Iec00c703eb21e1914903954cfd02f9f6b1ec2a1f Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
* Darwin: Disable QMacAutoReleasePool tracker in release buildsTor Arne Vestbø2023-05-151-2/+5
| | | | | | | | | | | It adds overhead that is noticeable, especially in tight loops that rely on an auto-release pool. For example, this improves the QLocale date to string transformations an order of a magnitude. Task-number: QTBUG-104785 Pick-to: 6.5 Change-Id: I246dc4e114bd75dd4e3e9e42b061c4c20c94d522 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
* Darwin: Remove QMacAutoReleasePool heap allocation detectionTor Arne Vestbø2023-05-151-47/+3
| | | | | | | | | | This is handled by the Objective-C runtime nowadays, where it will abort if the situation is detected, with the option to break on objc_autoreleasePoolInvalid to debug the situation. Pick-to: 6.5 Change-Id: Idf2c4aacc77e41a3deebf270303f4f13cfb0819b Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
* Doc: Replace mentions of deprecated macroTopi Reinio2023-05-151-1/+1
| | | | | | | | | Q_ENUMS() is deprecated in favor of Q_ENUM(). Pick-to: 6.5 Task-number: QTBUG-113229 Change-Id: I29cc23c87b1d6e8eeb49dd1d3ddaf4ca7d2cf8c2 Reviewed-by: Paul Wicking <paul.wicking@qt.io>
* QSlotObjectBase: move the `which` parameter to the 4th positionThiago Macieira2023-05-114-5/+39
| | | | | | | | | | | | | | | | | | | This places the first through third parameters on the exact positions that they will be used to perform the operations in the switch, saving the compiler from generating a few instructions to move data around. All ABIs Qt supports that pass any function parameters in registers at all pass at least 4. We keep the return type as void (instead of returning bool, for the Compare case) so the compiler can apply tail-call optimizations for those two typical cases. PMF case: https://gcc.godbolt.org/z/9oP5boKfj Function case: https://gcc.godbolt.org/z/e9vEzd5dj Functor case: https://gcc.godbolt.org/z/s8Ejjra7P Change-Id: I3e3bfef633af4130a03afffd175d3e3009c56323 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Fix QMetaObject::invokeMethod for free functions and std::bindVolker Hilsheimer2023-05-112-19/+7
| | | | | | | | | | | | | | | | | | | | Amends 3bf5b5f8944dd417530b09dd6f1cd568717c8cc1, after which free functions and std::bind could no longer be used as callables in QMetaMethod::invokeMethod. For free functions to work we need to decay to function pointers when choosing what type QtPrivate::Callable aliases. And std::bind has operator() overloads and the return type cannot be deduced. So simplify the definition of the ZeroArgFunctor - we know the function prototype if we know the return type. Add testcase for calling std::bind and free function, and remove the now unneeded helpers for functor argument and return type deduction. Change-Id: I54aac5cb6d660267e6b2f5ab05d583e8826cdf9a Reviewed-by: Zoltan Gera <zoltan.gera@qt.io> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QCallableObject: use QtPrivate::CompactStorageMarc Mutz2023-05-111-7/+11
| | | | | | | | | | | | | | | | | ... optimizing the storage of empty function objects. I thought we had applied this a long time ago, but it turns out that QPrivateSlotObject (c61d9873e5e30723bc5558b509b3320f2abf1da7) is only for QObjectPrivate::connect()... This adds the same optimization for regular QObject::connect(). This is BC, since we don't touch the base class (QSlotObjectBase), and the QCallableObject subclasses are all-inline or explicitly Q_DECL_HIDDEN. Amends c61d9873e5e30723bc5558b509b3320f2abf1da7. Change-Id: I63fd1b6f882b58f9f98eae67c636c3615248ad79 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QPointer: also make conversion to pointer-to-const workMarc Mutz2023-05-111-2/+4
| | | | | | | | | | | | | | | | | | | The QWeakPointer conversion SMFs cannot actually be used for QObject payloads, as, for unknown reasons (some comment about vtable this author doesn't understand), conversion goes through QSharedPointer, the creation of which throws the checkQObjectShared() warning and yields a nullptr. We need to continue to use the QWeakPointer(T*, bool) constructor the QPointer(T*) ctor also uses. It's high time we dissociated QPointer from QWeakPointer... Amends 5f28d367d999842a42fa0afa0d36d44ff61ea11d. Fixes: QTBUG-112464 Change-Id: I2f93843af3daf02323d77a4259eaa3745d8de3a8 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QDeadlineTimer: avoid a system call for timeout == 0Thiago Macieira2023-05-111-10/+32
| | | | | | | | | | | | | | | | | | The constructor's documentation already had the note saying that we could apply this optimization, but it wasn't there and looks like it never was. This only applies to the default constructor, which sets t1 to zero, which is the epoch. This could be a problem for an OS whose monotonic clock starts with negative values, but I don't know such an OS exists and this hasn't been a problem so far. This commit doesn't change the behavior of the old-style, non- std::chrono getters, because we always transform any negative remaining time to 0. It is only possible to observe it by asking the remaining time or the deadline using the std::chrono API. Change-Id: I6f518d59e63249ddbf43fffd175a3fc2911e91fb Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QDeadlineTimer: make it so any negative millisecond count is "forever"Thiago Macieira2023-05-111-7/+17
| | | | | | | | | | | | | | We have quite a few Qt API that assumes this, so making this change helps transitioning them to QDeadlineTimer. [ChangeLog][Important Behavior Changes] QDeadlineTimer will now interpret negative millisecond remaining times as "forever", instead of only the value -1. This brings the API closer in line with other API like QMutex. This change does not apply to the nanosecond counts in the API, nor to the API based on std::chrono. Change-Id: I6f518d59e63249ddbf43fffd175a3e5bead564ae Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QDeadlineTimer: use std::chrono::ceil() in setRemainingTime()Thiago Macieira2023-05-111-1/+2
| | | | | | | | | In case the time is of less than 1 ns, we want to make sure it remains non-zero. Change-Id: I3e3bfef633af4130a03afffd175d9c4903271f80 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io> Reviewed-by: Ahmad Samir <a.samirh78@gmail.com>
* QSlotObjectBase: move the m_ref after m_impl for Qt 7Thiago Macieira2023-05-101-3/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This moves the padding that exists on 64-bit architectures from between the two fields to the end of the the structure. In turns, this allows certain ABIs to reuse the tail padding space of the base class to store some information. It can only be used if the functor has alignment of 4 or less, but the interesting case is when it's an empty but final functor. The pahole report goes from: struct CallableObject : QSlotObjectBase { /* class QSlotObjectBase <ancestor>; */ /* 0 16 */ struct FinalFunctor func; /* 16 0 */ /* XXX last struct has 1 byte of padding */ /* size: 24, cachelines: 1, members: 2 */ /* padding: 8 */ /* paddings: 1, sum paddings: 1 */ } __attribute__((__aligned__(8))); to (pahole gets very confused by this trick): struct CallableObject : QSlotObjectBase { /* class QSlotObjectBase <ancestor>; */ /* 0 16 */ /* XXX last struct has 4 bytes of padding */ /* XXX 65532 bytes hole, try to pack */ struct FinalFunctor func; /* 12 0 */ /* size: 16, cachelines: 1, members: 2 */ /* padding: 4 */ /* paddings: 2, sum paddings: 5 */ /* BRAIN FART ALERT! 16 bytes != 0 (member bytes) + 0 (member bits) + 65532 (byte holes) + 0 (bit holes), diff = -524160 bits */ } __attribute__((__aligned__(8))); Change-Id: I3e3bfef633af4130a03afffd175d3be98511bae5 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* Rename QFunctorSlotObject to QCallableObjectVolker Hilsheimer2023-05-105-19/+20
| | | | | | | | | | | | | | After the recent changes we only have a single implementation of QSlotObjectBase, which can handle free functions, member functions, functors, and lambdas. Rename it to callable, and explicitly hide the static implementation function so that it doesn't become a symbol of static libraries using Qt. Also rename makeSlotObject to makeCallableObject, and polish coding style and comments in the qobjectdefs_impl header a bit. Change-Id: Id19107cedfe9c624f807cd8089beb80e9eb99f50 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Long live QtPrivate::CompactStorage<>Marc Mutz2023-05-091-24/+4
| | | | | | | | | | | | | | | | | | | | This is a generalization of QPrivateSlotObject's FunctionStorage. Changes from the old API: - uses a more neutral API (s/func/object/) - preserves cv-qualifiers and value categories - preserves constexpr'ness - adds a disambiguation tag (e.g. for use in a compressed_pair). The main feature is that it transparently uses the empty base-class optimization to stow away empty classes without allocating separate bytes for them. To be used for the public QSlotObject and QGenericRunnable, at least, so finally pulled the trigger and made it a separate component. Change-Id: I9a13bbdd1dcf64aaf5fc7b2d40a60050d61800b6 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Use QSlotObject helpers in functor-cases of QMetaObject::invokeVolker Hilsheimer2023-05-052-54/+47
| | | | | | | | | | | | | | | | | | | | Add helper that allows us to determine the argument list and return type of a functor. This triggers a compile time error if the functor has operator()() overloads (we only support zero-argument call operators, but there might be const/noexcept variations). Use that helper to declare a ZeroArgFunctor type which also declares a ReturnType and Arguments alias. Add a Callable alias that now combines FunctionPointer and ZeroArgFunctor into a single type that we can then use to merge the specializations of QMetaObject::invokeMethod. [ChangeLog][Potentially source-incompatible changes] Using a functor with several operator() overloads in QMetaObject::invokeMethod now causes a compile time error. Qt would previously ignore const and noexcept overloads and always call the mutable version on a copy of the functor. Change-Id: I3eb62c1128014b729575540deab615469290daeb Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QObject: simplify ImplFns of Q(Private)SlotObjectsMarc Mutz2023-05-052-7/+9
| | | | | | | | | | | Drag the cast out of each case to before the switch. DRYs the code. Pick-to: 6.5 Change-Id: I117cc5d38379a11e9852fba61794fa59dc24a30f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* Simplify invokeMethod implementations using QSlotObject helpersVolker Hilsheimer2023-05-042-53/+15
| | | | | | | | | Remove duplication for overloads covering member function pointer or function pointer cases, as those are now covered by the new QtPrivate::makeSlotObject helper. Change-Id: Ife1e05416958e40a4759ca06cf7db185031b8a86 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* Doc: fix warnings in QTimerVolker Hilsheimer2023-05-042-35/+22
| | | | | | | | Amends recent changes that added std::chrono support by making the duration type of QTimer::singleShot a template parameter. Change-Id: If3b5f0ad99304cb292412bb8467ba6852e47654f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* wasm: Fix permissionsLorn Potter2023-05-041-3/+0
| | | | | | | | | | | Trying to get a tracks list on a MediaStream without setting the src will generate an error in the callback and muck up the permissions handling. Pick-to: 6.5 Fixes: QTBUG-112901 Change-Id: Ide3a7336597fd0a08764e303dcc8f58755ba915d Reviewed-by: Mikołaj Boc <Mikolaj.Boc@qt.io>
* Pass functor through as references until storedVolker Hilsheimer2023-05-031-10/+12
| | | | | | | | | | | | | | Amends 642f799fc6c36c88834a7e2a10904816a962c2cb to avoid unnecessary copies in between the calls to the QFunctorSlotObject construcotr. We can't use a univeral reference in the QFunctorSlotObject constructor as the call is not deduced. So provide two overloads for lvalue and rvalue references instead. The compile check in the test now no longer fails as we delay the storage until one level later, but that's acceptable. Change-Id: Ide95b4a73c70f6f47698dd1e95138aa5d48ee95d Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QTimer: fix compilation with C++20Marc Mutz2023-05-021-1/+1
| | | | | | | | | | | | | | Implicit capture of *this by [=] is deprecated in C++20, and the replacement [=,this] is not available in C++17. We also can't use [&], because of QueuedConnection, so need to bite the bullet and list all captured variables separately. Amends 87535e4e4337596066258e361143cb9906e89512. Change-Id: I5b3a713bf9220746d10d594d1a248028157ad170 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
* QMetaProperty: add writeOnGadget() overload taking rvalue QVariantMarc Mutz2023-05-022-0/+11
| | | | | | | | | | | | | | | | | | The writeOnGadget() function is implemented in terms of write() (UB, btw, due to the cast to QObject*), which was recently overloaded for rvalue QVariants. Add a corresponding writeOnGadget() overload, too. [ChangeLog][QtCore][QMetaProperty] Added writeOnGadget() overload taking an rvalue QVariant. Amends 968250ee1444d3eabf3d805053f46015bc7185c5. Task-number: QTBUG-112762 Change-Id: I7fc686fcab293159f5a0d76dd6c8e23d5779c96c Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Merge QSlotObject and QFunctorSlotObject, and use helpers to deduplicateVolker Hilsheimer2023-05-022-127/+45
| | | | | | | | | | | Now we can use QFunctorSlotObject for any kind of callable - free function, functor, or PMF. This allows us to fold the various overloads of QObject::connect together, removing duplicate code and error handling logic. Change-Id: I8842f5ddd29e86be07a422647a8fc1678fd534b1 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* Remove QStaticSlotObject, use QFunctorSlotObject insteadVolker Hilsheimer2023-05-022-34/+10
| | | | | | | | The two slot object types are identical as long as we use a universal reference and perfect forwarding in the respective connect overloads. Change-Id: I999d71707dd045a17156e3bfecd371da7979beb1 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Use QSlotObject helper to drastically simplify QTimerVolker Hilsheimer2023-05-022-170/+40
| | | | | Change-Id: Iaeef5dcb5282eef834df62c7db09d05851bd7c2b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Respect expected return type in QSlotObject helperVolker Hilsheimer2023-05-021-3/+3
| | | | | | | | | | When making asynchronous functions, then the return type is not ever going to be anything but void, but this makes this helper symmetrical with QObject::connect logic, where we can then use it to simplify the code. Change-Id: I9e1b8bfffb726bb3d6d7282c87e07dc7e9ede5d1 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Make QSlotObject helpers usable for SFINAEVolker Hilsheimer2023-05-021-7/+17
| | | | | | | | Disable if any of the types used in the old-style connections is involved. Change-Id: Ie22c73704370c7f239d7303b555a0b572d2b4f22 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Modernize meta programming helpersVolker Hilsheimer2023-05-021-8/+5
| | | | | | | | Use std::declval and remove_reference_t instead of home-baked alternatives. Change-Id: Ia1b3ac6c2d9a6cdba1650c3acb249f2d65bcf94d Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Give QtPrivate::List a size value, simplify QFunctorSlotObjectVolker Hilsheimer2023-05-023-14/+14
| | | | | | | | | | | | The meta-programming list can easily know its size, so no need to pass both a list and its size as template parameters to QFunctorSlotObject, which simplifies existing code and is a step towards merging QFunctorSlotObject and QSlotObject. Also, remove the unused List_Select helper. Change-Id: I8ec6a0b707eab531ec06aba4e82223f242e53f2f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Fix test for move-only functor objectsVolker Hilsheimer2023-05-011-1/+1
| | | | | | | | | | | | | | Amend 3c6e9dcc623c9d7281a81174bb3a696e030f30a7 by making sure that we explicitly move move-only functors into the slot object in the respective tests, and that failing to do so doesn't compile. Also add test coverage for mutable lambdas, which work as they do with connected functors: the connection stores a copy, and calls don't modify the original functor. Change-Id: I637e6f407133e2f8f72109b3fe5369a11d19da93 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* Revert "Support move-only functors in invokeMethod and async APIs"Volker Hilsheimer2023-05-012-16/+16
| | | | | | | | | This reverts commit 9958edba41ac49097a54e0872c3c4934d2dd81f9, which incorrectly tested a move-only functor without actually moving the functor. Change-Id: I3707f9f8e5055102f7edfb3e1cb9750978356dd7 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* moc: Use a much, much shorter structure name for the StringDataThiago Macieira2023-05-011-22/+23
| | | | | | | | | | | | | | | | | | | | The old one kept all the indices in the type name, which was completely unnecessary. This caused the symbol name to explode for some very large meta object, notably that of the Qt namespace itself, causing gdb to produce this warning at every start: warning: internal error: string "StringData<3, 12, 7, 7, 6, 6, 9, 5, 10, 4, 6, 5, 5, 8, 7, 8, 10, 9, 9, 12, 11, 12, 12, 8, 6, 5, 13, 12, 9, [many lines suppressed] 33, 6, 6, 5, 6, 17, 12, 17, 13, 8, 7>" failed to be canonicalized To ensure there's no binary-compatibility problem with a StringData of two entries, the first parameter is now of type int. Pick-to: 6.5 Change-Id: I6f518d59e63249ddbf43fffd1759fbb66adc1299 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> Reviewed-by: Lars Knoll <lars@knoll.priv.no>
* Make QPointer<T> constructible from QPointer<X>Marc Mutz2023-04-292-0/+24
| | | | | | | | | | | | QWeakPointer can do the same, so there's no reason to not allow it for QPointer. [ChangeLog][QtCore][QPointer] QPointer<T> can now be (move- and copy-)constructed from QPointer<X>. Fixes: QTBUG-112464 Change-Id: I77cf5d39974bf2b3ec849b4afc33e286e864821e Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
* Doc: Fix documentation warningsTopi Reinio2023-04-291-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | These warnings slipped in during a time period where documentation testing in the CI was disabled. src/network/kernel/qhostinfo.cpp:254: (qdoc) warning: clang couldn't find function when parsing \fn template<typename Functor> int QHostInfo::lookupHost(const QString &name, Functor functor) src/widgets/widgets/qcheckbox.cpp:102: (qdoc) warning: clang couldn't find function when parsing \fn void QCheckBox::stateChanged(Qt::CheckState state) src/corelib/kernel/qcoreapplication.cpp:2769: (qdoc) warning: clang couldn't find function when parsing \fn template<typename Functor> void QCoreApplication::requestPermission( const QPermission &permission, Functor functor) src/corelib/serialization/qxmlstream.cpp:3806: (qdoc) warning: clang couldn't find function when parsing \fn bool QXmlStreamAttributes::hasAttribute( const QString &qualifiedName) const src/corelib/text/qtliterals.qdoc:11: (qdoc) warning: Multiple topic commands found in comment: \namespace and \headerfile. Pick-to: 6.5 Change-Id: I38c605f358dbca1ef3e2bfe20a6424f7a4d44b4a Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
* QCoreApplication: fix use-after-free of nl_langinfo() resultThiago Macieira2023-04-281-2/+2
| | | | | | | | | | | | | | | | | | | | | The result is retained so long as we don't attempt to change our locale, but failing to change that is the reason why we printed anything. ==20227==ERROR: AddressSanitizer: heap-use-after-free on address 0x000107312696 at pc 0x000103c48088 bp 0x00016ee180c0 sp 0x00016ee17880 READ of size 9 at 0x000107312696 thread T0 #0 0x103c48084 in wrap_strlen+0x164 (libclang_rt.asan_osx_dynamic.dylib:arm64e+0x18084) (BuildId: f0a7ac5c49bc3abc851181b6f92b308a32000000200000000100000000000b00) #1 0x1023804bc in QString::vasprintf(char const*, char*) qstring.cpp:7112 #2 0x102243578 in qt_message(QtMsgType, QMessageLogContext const&, char const*, char*) qlogging.cpp:368 #3 0x10252630c in QMessageLogger::warning(char const*, ...) const qlogging.cpp:647 #4 0x10229f940 in QCoreApplicationPrivate::initLocale() qcoreapplication.cpp:664 #5 0x10229fba0 in QCoreApplicationPrivate::init() qcoreapplication.cpp:826 #6 0x1022a07c0 in QCoreApplication::QCoreApplication(int&, char**, int) qcoreapplication.cpp:799 #7 0x101454ef8 in main+0xeb0 (WSgen:arm64+0x100470ef8) (BuildId: ae9b4fec1fd73c1693047a6b9d9ce91432000000200000000100000000000b00) Pick-to: 6.5 Task-number: QTBUG-111443 Change-Id: I6f518d59e63249ddbf43fffd1759d28738124797 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
* QMetaProperty: add write() overload taking rvalue QVariantMarc Mutz2023-04-282-4/+17
| | | | | | | | | | | | | | | | | | | | | | | The existing overload unconditionally copies the QVariant, causing it to unconditional detach in most cases (when calling data() later). The rvalue overload need not preserve the source object, so doesn't need to copy. Implement the lvalue overload in terms of the rvalue one, but keep the sanity check in both to avoid copying the QVariant just to find that there's nothing to do. Following the copy, there were some references to the source object, but they can all be replaced by references to the target object instead, which hasn't been touched by then, yet. [ChangeLog][QtCore][QMetaProperty] Added write() overload taking an rvalue QVariant. Fixes: QTBUG-112762 Change-Id: I0a8a91aa32143f071ebc8dae8f1f64b07fad9764 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QVariant: Fix support for metatypes created by Qt < 6.5Fabian Kosmale2023-04-282-3/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | In Qt >= 6.1, < 6.5, a trivially constructible type would have the NeedsDestruction flag set, but it's dtor pointer would have been null. In Qt 6.5, the meaning of the NeedsDestruction flag was changed to be more aligned with what the name suggests, and thus would only be set for non-trivially destructible types. For QMetaType this was fine, but QVariant has a check for acceptable metatypes which attempts to verify whether a QMetaType is usable for QVariant. The check assumes the semantics of Qt 6.5, and thus fails for metatypes created by older Qt versions. To fix this issue, we increment the QMetaType revision field, and only check the metatype's destruction support if the revision is high enough. In theory, that allows passing unsuitable metatypes from older Qt versions to QVariant; however, such code would have been broken in prior Qt releases already (which didn't attempt the check), and no code that used to work in any released Qt version will break (as we simply skip a check that was passing before). Fixes: QTBUG-113227 Pick-to: 6.5 Change-Id: I12e02bd97d2c410ea1a36efb0ce2389f21d50a30 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* Add a helper for better error messages when functor is incompatibleVolker Hilsheimer2023-04-282-0/+16
| | | | | | | | | | | | Amends 207aae5560aa2865ec55ddb9ecbb50048060c0c0 to make it easy to create human-friendly error messages. Since the functor-accepting member functions are not removed from the API, the first compile error will be that there is no suitable overload of the makeSlotObject helper, which. With the assert helper, the first error message is easier to understand. Change-Id: I4878ec35a44ddfa5dc9d9e358d81c3fd40389c0c Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Support move-only functors in invokeMethod and async APIsVolker Hilsheimer2023-04-282-16/+16
| | | | | | | | | | | | | Move-only functors must never be passed by value, so fix the QFunctorSlotObject constructor accordingly. This then requires adjustments to the various QMetaMethod::invokeMethod overloads, as those must also perfectly forwad the functor type. Enable the previously failing test case for move-only functors. Change-Id: I9c544fd3ddbc5e1da3ca193236291a9f83d86211 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* Support free functions and const functors as callbacksVolker Hilsheimer2023-04-282-12/+17
| | | | | | | | | | | | | | | | | | Amend 207aae5560aa2865ec55ddb9ecbb50048060c0c0, as code checker complained that we std::move'd a potential lvalue. This warning was valid if the public API did not accept the functor parameter by value. Fix this by consistently std::forward'ing the parameters through the call stack, and add a compile-time test. Writing that test revealed that the helper API didn't work with free functions, so fix that as well. It also revealed that QFunctorSlotObject couldn't work with a const functor, which is also fixed by this change. We cannot support move-only functors with that change, as it requires a change to QFunctorSlotObject that breaks the QMetaObject test. Change-Id: Iafd747baf4cb0213ecedb391ed46b4595388182b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QVariant: Add support for in-place constructionFabian Kosmale2023-04-272-0/+80
| | | | | | | | | | This avoids constructing an object just to copy (later: move) it into a QVariant. ChangeLog will be in a follow-up change adding emplace support. Task-number: QTBUG-112187 Change-Id: I444e580c7d8927d41b3d21d5a521e7c475119e4c Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* Doc: Fix return value for Q_ARG and Q_RETURN_ARGAndreas Eliasson2023-04-271-6/+7
| | | | | | | | | | | | The macros no longer return QGenericArgument and QGenericReturnArgument objects. As of 6.5, they return QMetaMethodArgument and QMetaMethodReturnArgument, respectively. Fixes: QTBUG-113147 Pick-to: 6.5 Change-Id: I06e0cf8255e6d4fee43048850f1717b1740d4846 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QApplicationStatic: document the thread-safety guaranteesThiago Macieira2023-04-261-3/+27
| | | | | Change-Id: Idd5e1bb52be047d7b4fffffd17531331df25c18c Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* QApplicationStatic: enforce acquire-release semantics on creationThiago Macieira2023-04-261-8/+8
| | | | | | | | | | | | | | | | | | | | | | | | | On systems with weak memory ordering, it was possible for the storeRelaxed(Initialized) to be observed by another thread performing a loadRelaxed() without observing the contents of the object itself. The mutex *does* release the contents of the object to memory, but without the corresponding mutex acquisition, we couldn't guarantee that the object's contents would be observed. Now we can. We don't need to fix the load inside the mutex because the mutex will have acquired everything from either a previous call to pointer() or to reset(). The store inside reset() need not be storeRelease() either because the effect of observing the Uninitialized state will be to lock the mutex. None of this is used to protect the data as it is being mutated by the user in multiple threads, or their access simultaneously with reset() (which is why the load outside the mutex was removed). Thanks to litb on Slack for noticing this and bringing to my attention. Pick-to: 6.5 Change-Id: Idd5e1bb52be047d7b4fffffd1752df5b4d9b2e3f Reviewed-by: Marc Mutz <marc.mutz@qt.io>
* Simplify the creation of APIs that take a callbackVolker Hilsheimer2023-04-262-45/+92
| | | | | | | | | | | | | | | | | | | | | | | Functions in Qt that take a callback need to support callables with or without context objects, and member functions of an object. The implementation of those overloads follows a pattern that ultimately results in a QSlotObjectBase implementation being created and passed to an implementation helper that takes care of the logic. Factor that common pattern into a new helper template in QtPrivate that returns a suitable QSlotObjectBase after checking that the functor is compatible with the specified argument types. Use that new helper template in the implementation of QCoreApplication::requestPermission and QHostInfo::lookupHost. The only disadvantage of centralizing this logic is that we cannot print a more detailed error message indicating which argument types the caller expects. However, that information is visible from the detailed compiler errors anyway. Change-Id: I24cf0b2442217857b96ffc4d2d6c997c4fae34e0 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
* QBluetoothPermission: introduce fine-grained permissionsIvan Solovev2023-04-263-7/+90
| | | | | | | | | | | | | This commit introduces fine-grained Bluetooth permissions control to the QBluetoothPermission class. For now the fine-tuning of the permissions is only supported on Android. On Apple enabling any of the permissions is equivalent to requesting full Bluetooth control. Task-number: QTBUG-109964 Change-Id: Ie7ac6577cf6a21419b73b33f8cf7e87bc3f8cf43 Reviewed-by: Marc Mutz <marc.mutz@qt.io> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
* Misc.: Fix some narrowing integral conversion warningsAhmad Samir2023-04-251-7/+1
| | | | | | | Drive-by change: use QByteArrayView instead of allocating a QByteArray. Change-Id: Iaf7acbbdb4efbb101b73b30061ce38dd1fa99ca3 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* QEventDispatcherGlib: fix some narrowing conversion warningsAhmad Samir2023-04-251-3/+2
| | | | | | | | "notifier->socket()" returns qint64, but sockfd should be int, because pollfd.fd is a gint (aka int). Change-Id: If6618aa5e652d4284b989352d61a28b605106d09 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>