From 8a660a7f684f0a0d8aa03a57fad1ad399110e2f5 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Thu, 4 Aug 2011 11:21:19 +0200 Subject: [PATCH] Fix wrong usage of QStringHash iterators. The code was creating circular lists of overloads. Change-Id: I126140dae90fbdf71a53fc8163fe2b56bb069312 Reviewed-on: http://codereview.qt.nokia.com/3782 Reviewed-by: Roberto Raggi Reviewed-by: Qt Sanity Bot --- src/declarative/qml/qdeclarativepropertycache.cpp | 29 ++++++++++++-------- 1 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/declarative/qml/qdeclarativepropertycache.cpp b/src/declarative/qml/qdeclarativepropertycache.cpp index bc3811a..6ccb5c6 100644 --- a/src/declarative/qml/qdeclarativepropertycache.cpp +++ b/src/declarative/qml/qdeclarativepropertycache.cpp @@ -330,6 +330,7 @@ void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaOb Data *data = &methodIndexCache[ii - methodIndexCacheStart]; data->lazyLoad(m); + if (data->isSignal()) data->flags |= signalFlags; else @@ -340,24 +341,26 @@ void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaOb data->metaObjectOffset = allowedRevisionCache.count() - 1; - Data **old = 0; + Data *old = 0; if (utf8) { QHashedString methodName(QString::fromUtf8(signature, cptr - signature)); - old = stringCache.value(methodName); + if (Data **it = stringCache.value(methodName)) + old = *it; stringCache.insert(methodName, data); } else { QHashedCStringRef methodName(signature, cptr - signature); - old = stringCache.value(methodName); + if (Data **it = stringCache.value(methodName)) + old = *it; stringCache.insert(methodName, data); } if (old) { // We only overload methods in the same class, exactly like C++ - if ((*old)->flags & Data::IsFunction && (*old)->coreIndex >= methodOffset) - data->relatedIndex = (*old)->coreIndex; - data->overrideIndexIsProperty = !bool((*old)->flags & Data::IsFunction); - data->overrideIndex = (*old)->coreIndex; + if (old->flags & Data::IsFunction && old->coreIndex >= methodOffset) + data->relatedIndex = old->coreIndex; + data->overrideIndexIsProperty = !bool(old->flags & Data::IsFunction); + data->overrideIndex = old->coreIndex; } } @@ -385,21 +388,23 @@ void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaOb data->metaObjectOffset = allowedRevisionCache.count() - 1; - Data **old = 0; + Data *old = 0; if (utf8) { QHashedString propName(QString::fromUtf8(str, cptr - str)); - old = stringCache.value(propName); + if (Data **it = stringCache.value(propName)) + old = *it; stringCache.insert(propName, data); } else { QHashedCStringRef propName(str, cptr - str); - old = stringCache.value(propName); + if (Data **it = stringCache.value(propName)) + old = *it; stringCache.insert(propName, data); } if (old) { - data->overrideIndexIsProperty = !bool((*old)->flags & Data::IsFunction); - data->overrideIndex = (*old)->coreIndex; + data->overrideIndexIsProperty = !bool(old->flags & Data::IsFunction); + data->overrideIndex = old->coreIndex; } } } -- 1.7.2.5