Fix wrong usage of QStringHash iterators.
authorRoberto Raggi <roberto.raggi@nokia.com>
Thu, 4 Aug 2011 09:21:19 +0000 (11:21 +0200)
committerQt by Nokia <qt-info@nokia.com>
Tue, 30 Aug 2011 11:18:28 +0000 (13:18 +0200)
The code was creating circular lists of overloads.

Change-Id: I126140dae90fbdf71a53fc8163fe2b56bb069312
Reviewed-on: http://codereview.qt.nokia.com/3782
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>

src/declarative/qml/qdeclarativepropertycache.cpp

index bc3811a..6ccb5c6 100644 (file)
@@ -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;
         }
     }
 }