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:
Jocelyn Turcotte 2015-08-10 21:39:04 +02:00 committed by Jocelyn Turcotte (Woboq GmbH)
parent 2f43ac9dcd
commit 1977855f31
2 changed files with 3 additions and 18 deletions

View File

@ -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

View File

@ -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)