From f9c2094e49f2f4bb5a5c3d76e7f78c0de7d720a8 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 30 Apr 2012 11:01:05 +0200 Subject: Restructure how we initialize hash nodes a little This should help to silence coverity which was complaining hundreds of times about Qt not initializing h and next in QHashNode. Change-Id: Ib7977693e9786d4b310799e4f428115c65bb3fee Reviewed-by: Thiago Macieira --- src/corelib/tools/qhash.cpp | 1 - src/corelib/tools/qhash.h | 28 ++++++++++++++-------------- 2 files changed, 14 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp index a2851d15bd..10dcff92c7 100644 --- a/src/corelib/tools/qhash.cpp +++ b/src/corelib/tools/qhash.cpp @@ -369,7 +369,6 @@ QHashData *QHashData::detach_helper(void (*node_duplicate)(Node *, void *), QT_RETHROW; } - dup->h = oldNode->h; *nextNode = dup; nextNode = &dup->next; oldNode = oldNode->next; diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h index fe6a8dfad1..d196e6e376 100644 --- a/src/corelib/tools/qhash.h +++ b/src/corelib/tools/qhash.h @@ -197,27 +197,29 @@ inline bool operator==(const QHashDummyValue & /* v1 */, const QHashDummyValue & Q_DECLARE_TYPEINFO(QHashDummyValue, Q_MOVABLE_TYPE | Q_DUMMY_TYPE); template -struct QHashDummyNode +struct QHashNode { - QHashDummyNode *next; + QHashNode *next; uint h; Key key; + T value; - inline QHashDummyNode(const Key &key0) : key(key0) {} + inline QHashNode(const Key &key0, const T &value0, uint hash, QHashNode *n) + : next(n), h(hash), key(key0), value(value0) {} + inline bool same_key(uint h0, const Key &key0) { return h0 == h && key0 == key; } }; template -struct QHashNode +struct QHashDummyNode { - QHashNode *next; + QHashNode *next; uint h; Key key; - T value; - inline QHashNode(const Key &key0, const T &value0) : key(key0), value(value0) {} - inline bool same_key(uint h0, const Key &key0) { return h0 == h && key0 == key; } + inline QHashDummyNode(const Key &key0, uint hash, QHashNode *n) : next(n), h(hash), key(key0) {} }; + #if 0 // ### // The introduction of the QHash random seed breaks this optimization, as it @@ -519,9 +521,9 @@ Q_INLINE_TEMPLATE void QHash::duplicateNode(QHashData::Node *node, void { Node *concreteNode = concrete(node); if (QTypeInfo::isDummy) { - (void) new (newNode) DummyNode(concreteNode->key); + (void) new (newNode) DummyNode(concreteNode->key, concreteNode->h, 0); } else { - (void) new (newNode) Node(concreteNode->key, concreteNode->value); + (void) new (newNode) Node(concreteNode->key, concreteNode->value, concreteNode->h, 0); } } @@ -532,13 +534,11 @@ QHash::createNode(uint ah, const Key &akey, const T &avalue, Node **anex Node *node; if (QTypeInfo::isDummy) { - node = reinterpret_cast(new (d->allocateNode(alignOfDummyNode())) DummyNode(akey)); + node = reinterpret_cast(new (d->allocateNode(alignOfDummyNode())) DummyNode(akey, ah, *anextNode)); } else { - node = new (d->allocateNode(alignOfNode())) Node(akey, avalue); + node = new (d->allocateNode(alignOfNode())) Node(akey, avalue, ah, *anextNode); } - node->h = ah; - node->next = *anextNode; *anextNode = node; ++d->size; return node; -- cgit v1.2.3