Use correct types in QResource.
authorRobin Burchell <robin+qt@viroteck.net>
Fri, 2 Mar 2012 14:05:59 +0000 (15:05 +0100)
committerQt by Nokia <qt-info@nokia.com>
Fri, 2 Mar 2012 15:07:47 +0000 (16:07 +0100)
qHash() returns uint, not int, so change all interactions with hashing to use
uint to match.

This blocks the introduction of a new (better) hashing algorithm because it
currently breaks numerous tests: rcc would (correctly) write a uint hash value
to the qrc files, but QResource would attempt to mangle it around as an int.

This wasn't a problem with the old hash, because it deliberately threw away
data (h &= 0x0fffffff), possibly because of someone not being able to
diagnose precisly this problem.

Change-Id: I46fb42acc100fdd3bedd714f6dc91aeca91d0351
Reviewed-by: hjk <qthjk@ovi.com>
src/corelib/io/qresource.cpp

index e46ab26..fb3a24b 100644 (file)
@@ -114,7 +114,7 @@ class QResourceRoot
     };
     const uchar *tree, *names, *payloads;
     inline int findOffset(int node) const { return node * 14; } //sizeof each tree element
-    int hash(int node) const;
+    uint hash(int node) const;
     QString name(int node) const;
     short flags(int node) const;
 public:
@@ -594,7 +594,7 @@ QResource::searchPaths()
     return *resourceSearchPaths();
 }
 
-inline int QResourceRoot::hash(int node) const
+inline uint QResourceRoot::hash(int node) const
 {
     if(!node) //root
         return 0;
@@ -673,13 +673,13 @@ int QResourceRoot::findNode(const QString &_path, const QLocale &locale) const
             qDebug() << "   " << child+j << " :: " << name(child+j);
         }
 #endif
-        const int h = qHash(segment);
+        const uint h = qHash(segment);
 
         //do the binary search for the hash
         int l = 0, r = child_count-1;
         int sub_node = (l+r+1)/2;
         while(r != l) {
-            const int sub_node_hash = hash(child+sub_node);
+            const uint sub_node_hash = hash(child+sub_node);
             if(h == sub_node_hash)
                 break;
             else if(h < sub_node_hash)