From cd18e93845fd2e3148a01391aa77b93bb907d21c Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sun, 5 Jul 2015 22:43:08 +0200 Subject: [PATCH] platformsupport/linuxaccessibility: fix uses of inefficient QLists These types are larger than a void*, so holding them in QLists is needlessly inefficient. Worse, the code could come to depend on the fragile property of (inefficient) QLists that references to elements therein never are invalidated. Fix by marking them movable, and holding in a QVector instead. Change-Id: I3d5cf78c1597bd1b743ed3692aaa5e2e750a85f9 Reviewed-by: Frederik Gladhorn --- .../linuxaccessibility/atspiadaptor.cpp | 2 +- .../linuxaccessibility/cache.cpp | 3 +- .../linuxaccessibility/struct_marshallers_p.h | 32 ++++++++++++------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp index 47c37ba6dc..d155cecd89 100644 --- a/src/platformsupport/linuxaccessibility/atspiadaptor.cpp +++ b/src/platformsupport/linuxaccessibility/atspiadaptor.cpp @@ -1509,7 +1509,7 @@ QSpiRelationArray AtSpiAdaptor::relationSet(QAccessibleInterface *interface, con Q_FOREACH (const RelationPair &pair, relationInterfaces) { // FIXME: this loop seems a bit strange... "related" always have one item when we check. //And why is it a list, when it always have one item? And it seems to assume that the QAccessible::Relation enum maps directly to AtSpi - QList related; + QSpiObjectReferenceArray related; QDBusObjectPath path = QDBusObjectPath(pathForInterface(pair.first)); related.append(QSpiObjectReference(connection, path)); diff --git a/src/platformsupport/linuxaccessibility/cache.cpp b/src/platformsupport/linuxaccessibility/cache.cpp index 2ece905fdf..0ccd2cba6e 100644 --- a/src/platformsupport/linuxaccessibility/cache.cpp +++ b/src/platformsupport/linuxaccessibility/cache.cpp @@ -78,8 +78,7 @@ void QSpiDBusCache::emitRemoveAccessible(const QSpiObjectReference& item) QSpiAccessibleCacheArray QSpiDBusCache::GetItems() { - QList cacheArray; - return cacheArray; + return QSpiAccessibleCacheArray(); } QT_END_NAMESPACE diff --git a/src/platformsupport/linuxaccessibility/struct_marshallers_p.h b/src/platformsupport/linuxaccessibility/struct_marshallers_p.h index 7788ceb7cc..61d79e6daa 100644 --- a/src/platformsupport/linuxaccessibility/struct_marshallers_p.h +++ b/src/platformsupport/linuxaccessibility/struct_marshallers_p.h @@ -46,7 +46,7 @@ // We mean it. // -#include +#include #include #include #include @@ -55,8 +55,8 @@ #ifndef QT_NO_ACCESSIBILITY QT_BEGIN_NAMESPACE -typedef QList QSpiIntList; -typedef QList QSpiUIntList; +typedef QVector QSpiIntList; +typedef QVector QSpiUIntList; // FIXME: make this copy on write struct QSpiObjectReference @@ -68,26 +68,29 @@ struct QSpiObjectReference QSpiObjectReference(const QDBusConnection& connection, const QDBusObjectPath& path) : service(connection.baseService()), path(path) {} }; +Q_DECLARE_TYPEINFO(QSpiObjectReference, Q_MOVABLE_TYPE); // QDBusObjectPath is movable, even though it + // cannot be marked that way until Qt 6 QDBusArgument &operator<<(QDBusArgument &argument, const QSpiObjectReference &address); const QDBusArgument &operator>>(const QDBusArgument &argument, QSpiObjectReference &address); -typedef QList QSpiObjectReferenceArray; +typedef QVector QSpiObjectReferenceArray; struct QSpiAccessibleCacheItem { QSpiObjectReference path; QSpiObjectReference application; QSpiObjectReference parent; - QList children; + QSpiObjectReferenceArray children; QStringList supportedInterfaces; QString name; uint role; QString description; QSpiUIntList state; }; +Q_DECLARE_TYPEINFO(QSpiAccessibleCacheItem, Q_MOVABLE_TYPE); -typedef QList QSpiAccessibleCacheArray; +typedef QVector QSpiAccessibleCacheArray; QDBusArgument &operator<<(QDBusArgument &argument, const QSpiAccessibleCacheItem &item); const QDBusArgument &operator>>(const QDBusArgument &argument, QSpiAccessibleCacheItem &item); @@ -98,8 +101,9 @@ struct QSpiAction QString description; QString keyBinding; }; +Q_DECLARE_TYPEINFO(QSpiAction, Q_MOVABLE_TYPE); -typedef QList QSpiActionArray; +typedef QVector QSpiActionArray; QDBusArgument &operator<<(QDBusArgument &argument, const QSpiAction &action); const QDBusArgument &operator>>(const QDBusArgument &argument, QSpiAction &action); @@ -109,14 +113,15 @@ struct QSpiEventListener QString listenerAddress; QString eventName; }; +Q_DECLARE_TYPEINFO(QSpiEventListener, Q_MOVABLE_TYPE); -typedef QList QSpiEventListenerArray; +typedef QVector QSpiEventListenerArray; QDBusArgument &operator<<(QDBusArgument &argument, const QSpiEventListener &action); const QDBusArgument &operator>>(const QDBusArgument &argument, QSpiEventListener &action); -typedef QPair < unsigned int, QList < QSpiObjectReference > > QSpiRelationArrayEntry; -typedef QList< QSpiRelationArrayEntry > QSpiRelationArray; +typedef QPair QSpiRelationArrayEntry; +typedef QVector QSpiRelationArray; //a(iisv) struct QSpiTextRange { @@ -125,18 +130,22 @@ struct QSpiTextRange { QString contents; QVariant v; }; -typedef QList QSpiTextRangeList; +Q_DECLARE_TYPEINFO(QSpiTextRange, Q_MOVABLE_TYPE); + +typedef QVector QSpiTextRangeList; typedef QMap QSpiAttributeSet; enum QSpiAppUpdateType { QSPI_APP_UPDATE_ADDED = 0, QSPI_APP_UPDATE_REMOVED = 1 }; +Q_DECLARE_TYPEINFO(QSpiAppUpdateType, Q_PRIMITIVE_TYPE); struct QSpiAppUpdate { int type; /* Is an application added or removed */ QString address; /* D-Bus address of application added or removed */ }; +Q_DECLARE_TYPEINFO(QSpiAppUpdate, Q_MOVABLE_TYPE); QDBusArgument &operator<<(QDBusArgument &argument, const QSpiAppUpdate &update); const QDBusArgument &operator>>(const QDBusArgument &argument, QSpiAppUpdate &update); @@ -150,6 +159,7 @@ struct QSpiDeviceEvent { QString text; bool isText; }; +Q_DECLARE_TYPEINFO(QSpiDeviceEvent, Q_MOVABLE_TYPE); QDBusArgument &operator<<(QDBusArgument &argument, const QSpiDeviceEvent &event); const QDBusArgument &operator>>(const QDBusArgument &argument, QSpiDeviceEvent &event);