Avoid recreating QVariantLists when extracted from a QVariant
Wrapping a QVariantList in a QVariant to pass it to QML would
trigger a deep copy each time QML would try to access elements
in the list (specifically in QQmlListAccessor::at).
This reverts a part of 8c4deff51c
by specifying the associative array conversions explicitly without
including the current type in the list of types to convert through
an iteration.
Task-number: QTBUG-41403
Change-Id: If9fddfe6d36f789ac4aa61a7c32677cd1dd077d8
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
This commit is contained in:
parent
2f43ac9dcd
commit
1977855f31
@ -2244,21 +2244,6 @@ namespace QtPrivate {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace QtMetaTypePrivate {
|
|
||||||
inline Q_DECL_CONSTEXPR bool isBuiltinSequentialType(int typeId)
|
|
||||||
{
|
|
||||||
return typeId == qMetaTypeId<QStringList>()
|
|
||||||
|| typeId == qMetaTypeId<QByteArrayList>()
|
|
||||||
|| typeId == qMetaTypeId<QVariantList>();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Q_DECL_CONSTEXPR bool isBuiltinAssociativeType(int typeId)
|
|
||||||
{
|
|
||||||
return typeId == qMetaTypeId<QVariantHash>()
|
|
||||||
|| typeId == qMetaTypeId<QVariantMap>();
|
|
||||||
}
|
|
||||||
} // QtMetaTypePrivate
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
#endif // QMETATYPE_H
|
#endif // QMETATYPE_H
|
||||||
|
@ -750,7 +750,7 @@ namespace QtPrivate {
|
|||||||
static QVariantList invoke(const QVariant &v)
|
static QVariantList invoke(const QVariant &v)
|
||||||
{
|
{
|
||||||
const int typeId = v.userType();
|
const int typeId = v.userType();
|
||||||
if (QtMetaTypePrivate::isBuiltinSequentialType(typeId) || QMetaType::hasRegisteredConverterFunction(typeId, qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>())) {
|
if (typeId == qMetaTypeId<QStringList>() || typeId == qMetaTypeId<QByteArrayList>() || QMetaType::hasRegisteredConverterFunction(typeId, qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>())) {
|
||||||
QSequentialIterable iter = QVariantValueHelperInterface<QSequentialIterable>::invoke(v);
|
QSequentialIterable iter = QVariantValueHelperInterface<QSequentialIterable>::invoke(v);
|
||||||
QVariantList l;
|
QVariantList l;
|
||||||
l.reserve(iter.size());
|
l.reserve(iter.size());
|
||||||
@ -767,7 +767,7 @@ namespace QtPrivate {
|
|||||||
static QVariantHash invoke(const QVariant &v)
|
static QVariantHash invoke(const QVariant &v)
|
||||||
{
|
{
|
||||||
const int typeId = v.userType();
|
const int typeId = v.userType();
|
||||||
if (QtMetaTypePrivate::isBuiltinAssociativeType(typeId) || QMetaType::hasRegisteredConverterFunction(typeId, qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>())) {
|
if (typeId == qMetaTypeId<QVariantMap>() || QMetaType::hasRegisteredConverterFunction(typeId, qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>())) {
|
||||||
QAssociativeIterable iter = QVariantValueHelperInterface<QAssociativeIterable>::invoke(v);
|
QAssociativeIterable iter = QVariantValueHelperInterface<QAssociativeIterable>::invoke(v);
|
||||||
QVariantHash l;
|
QVariantHash l;
|
||||||
l.reserve(iter.size());
|
l.reserve(iter.size());
|
||||||
@ -784,7 +784,7 @@ namespace QtPrivate {
|
|||||||
static QVariantMap invoke(const QVariant &v)
|
static QVariantMap invoke(const QVariant &v)
|
||||||
{
|
{
|
||||||
const int typeId = v.userType();
|
const int typeId = v.userType();
|
||||||
if (QtMetaTypePrivate::isBuiltinAssociativeType(typeId) || QMetaType::hasRegisteredConverterFunction(typeId, qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>())) {
|
if (typeId == qMetaTypeId<QVariantHash>() || QMetaType::hasRegisteredConverterFunction(typeId, qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>())) {
|
||||||
QAssociativeIterable iter = QVariantValueHelperInterface<QAssociativeIterable>::invoke(v);
|
QAssociativeIterable iter = QVariantValueHelperInterface<QAssociativeIterable>::invoke(v);
|
||||||
QVariantMap l;
|
QVariantMap l;
|
||||||
for (QAssociativeIterable::const_iterator it = iter.begin(), end = iter.end(); it != end; ++it)
|
for (QAssociativeIterable::const_iterator it = iter.begin(), end = iter.end(); it != end; ++it)
|
||||||
|
Loading…
Reference in New Issue
Block a user