Commit 8563adb7 authored by Alan Alpert's avatar Alan Alpert Committed by The Qt Project
Browse files

Avoid modifying cacheCount while iterating over it


Because the cache items can be referenced in bindings, the last ref for
the item can be cleared at any time due to JS ownership. This could
modify the cache count while iterating over it. The removal from the
cache list is now postponed until iteration is finished. All iteration
cases can already handle an invalid cache item being found in the list.

Task-number: QTBUG-30555
Change-Id: I1c0721b4d7e0dd69ce7a73824c1aa7b50d2c32a2
Reviewed-by: default avatarAlbert Astals Cid <albert.astals@canonical.com>
Reviewed-by: default avatarLars Knoll <lars.knoll@digia.com>
parent 0bcf5496
dev 5.10 5.11 5.12 5.12.1 5.12.10 5.12.11 5.12.12 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13 5.13.0 5.13.1 5.13.2 5.14 5.14.0 5.14.1 5.14.2 5.15 5.15.0 5.15.1 5.15.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.9.8 6.0 6.0.0 6.1 6.1.0 6.1.1 6.1.2 6.1.3 6.2 6.2.0 6.2.1 6.2.2 old/5.1 old/5.2 wip/cmake wip/dbus wip/gc wip/itemviews wip/nacl wip/new-backend wip/pointerhandler wip/propertycache-refactor wip/qquickdeliveryagent wip/scenegraphng wip/tizen wip/webassembly v5.15.0-alpha1 v5.14.1 v5.14.0 v5.14.0-rc2 v5.14.0-rc1 v5.14.0-beta3 v5.14.0-beta2 v5.14.0-beta1 v5.14.0-alpha1 v5.13.2 v5.13.1 v5.13.0 v5.13.0-rc3 v5.13.0-rc2 v5.13.0-rc1 v5.13.0-beta4 v5.13.0-beta3 v5.13.0-beta2 v5.13.0-beta1 v5.13.0-alpha1 v5.12.7 v5.12.6 v5.12.5 v5.12.4 v5.12.3 v5.12.2 v5.12.1 v5.12.0 v5.12.0-rc2 v5.12.0-rc1 v5.12.0-beta4 v5.12.0-beta3 v5.12.0-beta2 v5.12.0-beta1 v5.12.0-alpha1 v5.11.3 v5.11.2 v5.11.1 v5.11.0 v5.11.0-rc2 v5.11.0-rc1 v5.11.0-beta4 v5.11.0-beta3 v5.11.0-beta2 v5.11.0-beta1 v5.11.0-alpha1 v5.10.1 v5.10.0 v5.10.0-rc3 v5.10.0-rc2 v5.10.0-rc1 v5.10.0-beta4 v5.10.0-beta3 v5.10.0-beta2 v5.10.0-beta1 v5.10.0-alpha1 v5.9.9 v5.9.8 v5.9.7 v5.9.6 v5.9.5 v5.9.4 v5.9.3 v5.9.2 v5.9.1 v5.9.0 v5.9.0-rc2 v5.9.0-rc1 v5.9.0-beta4 v5.9.0-beta3 v5.9.0-beta2 v5.9.0-beta1 v5.9.0-alpha1 v5.8.0 v5.8.0-rc1 v5.8.0-beta1 v5.8.0-alpha1 v5.7.1 v5.7.0 v5.7.0-rc1 v5.7.0-beta1 v5.7.0-alpha1 v5.6.3 v5.6.2 v5.6.1 v5.6.1-1 v5.6.0 v5.6.0-rc1 v5.6.0-beta1 v5.6.0-alpha1 v5.5.1 v5.5.0 v5.5.0-rc1 v5.5.0-beta1 v5.5.0-alpha1 v5.4.2 v5.4.1 v5.4.0 v5.4.0-rc1 v5.4.0-beta1 v5.4.0-alpha1 v5.3.2 v5.3.1 v5.3.0 v5.3.0-rc1 v5.3.0-beta1 v5.3.0-alpha1 v5.2.1 v5.2.0 v5.2.0-rc1 v5.2.0-beta1 v5.2.0-alpha1 v5.1.1 v5.1.0 v5.1.0-rc2 v5.1.0-rc1 v5.1.0-beta1
No related merge requests found
Showing with 16 additions and 13 deletions
...@@ -1158,8 +1158,8 @@ void QQmlDelegateModelPrivate::itemsInserted( ...@@ -1158,8 +1158,8 @@ void QQmlDelegateModelPrivate::itemsInserted(
cacheIndex = insert.cacheIndex + insert.count; cacheIndex = insert.cacheIndex + insert.count;
} }
} }
for (; cacheIndex < m_cache.count(); ++cacheIndex) for (const QList<QQmlDelegateModelItem *> cache = m_cache; cacheIndex < cache.count(); ++cacheIndex)
incrementIndexes(m_cache.at(cacheIndex), m_groupCount, inserted); incrementIndexes(cache.at(cacheIndex), m_groupCount, inserted);
} }
void QQmlDelegateModelPrivate::itemsInserted(const QVector<Compositor::Insert> &inserts) void QQmlDelegateModelPrivate::itemsInserted(const QVector<Compositor::Insert> &inserts)
...@@ -1183,8 +1183,9 @@ void QQmlDelegateModel::_q_itemsInserted(int index, int count) ...@@ -1183,8 +1183,9 @@ void QQmlDelegateModel::_q_itemsInserted(int index, int count)
d->m_count += count; d->m_count += count;
for (int i = 0, c = d->m_cache.count(); i < c; ++i) { const QList<QQmlDelegateModelItem *> cache = d->m_cache;
QQmlDelegateModelItem *item = d->m_cache.at(i); for (int i = 0, c = cache.count(); i < c; ++i) {
QQmlDelegateModelItem *item = cache.at(i);
if (item->modelIndex() >= index) if (item->modelIndex() >= index)
item->setModelIndex(item->modelIndex() + count); item->setModelIndex(item->modelIndex() + count);
} }
...@@ -1275,8 +1276,8 @@ void QQmlDelegateModelPrivate::itemsRemoved( ...@@ -1275,8 +1276,8 @@ void QQmlDelegateModelPrivate::itemsRemoved(
} }
} }
for (; cacheIndex < m_cache.count(); ++cacheIndex) for (const QList<QQmlDelegateModelItem *> cache = m_cache; cacheIndex < cache.count(); ++cacheIndex)
incrementIndexes(m_cache.at(cacheIndex), m_groupCount, removed); incrementIndexes(cache.at(cacheIndex), m_groupCount, removed);
} }
void QQmlDelegateModelPrivate::itemsRemoved(const QVector<Compositor::Remove> &removes) void QQmlDelegateModelPrivate::itemsRemoved(const QVector<Compositor::Remove> &removes)
...@@ -1298,9 +1299,9 @@ void QQmlDelegateModel::_q_itemsRemoved(int index, int count) ...@@ -1298,9 +1299,9 @@ void QQmlDelegateModel::_q_itemsRemoved(int index, int count)
return; return;
d->m_count -= count; d->m_count -= count;
const QList<QQmlDelegateModelItem *> cache = d->m_cache;
for (int i = 0, c = d->m_cache.count(); i < c; ++i) { for (int i = 0, c = cache.count(); i < c; ++i) {
QQmlDelegateModelItem *item = d->m_cache.at(i); QQmlDelegateModelItem *item = cache.at(i);
if (item->modelIndex() >= index + count) if (item->modelIndex() >= index + count)
item->setModelIndex(item->modelIndex() - count); item->setModelIndex(item->modelIndex() - count);
else if (item->modelIndex() >= index) else if (item->modelIndex() >= index)
...@@ -1346,8 +1347,9 @@ void QQmlDelegateModel::_q_itemsMoved(int from, int to, int count) ...@@ -1346,8 +1347,9 @@ void QQmlDelegateModel::_q_itemsMoved(int from, int to, int count)
const int maximum = qMax(from, to) + count; const int maximum = qMax(from, to) + count;
const int difference = from > to ? count : -count; const int difference = from > to ? count : -count;
for (int i = 0, c = d->m_cache.count(); i < c; ++i) { const QList<QQmlDelegateModelItem *> cache = d->m_cache;
QQmlDelegateModelItem *item = d->m_cache.at(i); for (int i = 0, c = cache.count(); i < c; ++i) {
QQmlDelegateModelItem *item = cache.at(i);
if (item->modelIndex() >= from && item->modelIndex() < from + count) if (item->modelIndex() >= from && item->modelIndex() < from + count)
item->setModelIndex(item->modelIndex() - from + to); item->setModelIndex(item->modelIndex() - from + to);
else if (item->modelIndex() >= minimum && item->modelIndex() < maximum) else if (item->modelIndex() >= minimum && item->modelIndex() < maximum)
...@@ -1421,8 +1423,9 @@ void QQmlDelegateModel::_q_modelReset() ...@@ -1421,8 +1423,9 @@ void QQmlDelegateModel::_q_modelReset()
if (d->m_complete) { if (d->m_complete) {
d->m_count = d->m_adaptorModel.count(); d->m_count = d->m_adaptorModel.count();
for (int i = 0, c = d->m_cache.count(); i < c; ++i) { const QList<QQmlDelegateModelItem *> cache = d->m_cache;
QQmlDelegateModelItem *item = d->m_cache.at(i); for (int i = 0, c = cache.count(); i < c; ++i) {
QQmlDelegateModelItem *item = cache.at(i);
if (item->modelIndex() != -1) if (item->modelIndex() != -1)
item->setModelIndex(-1); item->setModelIndex(-1);
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment