From 1e0f2be5ac60884f0164f9b9dc2f8cffb21a969a Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 20 Oct 2020 10:22:07 +0200 Subject: Do not store non relocatable types in QVariants internal storage This mostly reverts change 76e8e8e9c8093f093cb9f37d61d273f43398fefb. The reason is that storing non relocatable types inline in QVariants storage would implicitly make QVariant non relocatable. Fixes: QTBUG-87686 Change-Id: I2a09b1dcdd907d60085dccf17f987086dcba878c Reviewed-by: Thiago Macieira Reviewed-by: Fabian Kosmale --- src/corelib/kernel/qvariant.cpp | 2 +- src/corelib/kernel/qvariant.h | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index cd2004680b..56e428b052 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -255,7 +255,7 @@ static void customConstruct(QVariant::Private *d, const void *copy) return; } - if (QVariant::Private::canUseInternalSpace(size, type.alignOf())) { + if (QVariant::Private::canUseInternalSpace(type)) { type.construct(&d->data, copy); d->is_shared = false; } else { diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index aa74aaa18f..012b5c52b6 100644 --- a/src/corelib/kernel/qvariant.h +++ b/src/corelib/kernel/qvariant.h @@ -442,9 +442,12 @@ class Q_CORE_EXPORT QVariant { static constexpr size_t MaxInternalSize = 3*sizeof(void *); template - static constexpr bool CanUseInternalSpace = (sizeof(T) <= MaxInternalSize && alignof(T) <= alignof(double)); - static constexpr bool canUseInternalSpace(size_t s, size_t align) - { return s <= MaxInternalSize && align <= alignof(double); } + static constexpr bool CanUseInternalSpace = (QTypeInfo::isRelocatable && sizeof(T) <= MaxInternalSize && alignof(T) <= alignof(double)); + static constexpr bool canUseInternalSpace(QMetaType type) + { + return type.flags() & QMetaType::RelocatableType && + size_t(type.sizeOf()) <= MaxInternalSize && size_t(type.alignOf()) <= alignof(double); + } union { -- cgit v1.2.3