summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-09-17 00:52:03 +0400
committerDmitry Stogov <dmitry@zend.com>2014-09-17 00:52:03 +0400
commitc2decc6afc594ef67bc8f21e0f8d79a8236b000e (patch)
tree6c530255a8bbc3e48c80dc7fa3fbbbfe696c79f5
parent7ba43ea05241ad474d40ab199c6a710e21048cd5 (diff)
downloadphp-git-c2decc6afc594ef67bc8f21e0f8d79a8236b000e.tar.gz
optimized colision list traverse
-rw-r--r--Zend/zend_hash.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index ba18b9b48c..e603069e4a 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -643,19 +643,18 @@ static zend_always_inline void _zend_hash_del_el_ex(HashTable *ht, uint32_t idx,
static zend_always_inline void _zend_hash_del_el(HashTable *ht, uint32_t idx, Bucket *p)
{
- uint32_t nIndex;
Bucket *prev = NULL;
if (!(ht->u.flags & HASH_FLAG_PACKED)) {
- nIndex = p->h & ht->nTableMask;
- idx = ht->arHash[nIndex];
- if (p != ht->arData + idx) {
- prev = ht->arData + idx;
- while (ht->arData + Z_NEXT(prev->val) != p) {
- idx = Z_NEXT(prev->val);
- prev = ht->arData + idx;
+ uint32_t nIndex = p->h & ht->nTableMask;
+ uint32_t i = ht->arHash[nIndex];
+
+ if (i != idx) {
+ prev = ht->arData + i;
+ while (Z_NEXT(prev->val) != idx) {
+ i = Z_NEXT(prev->val);
+ prev = ht->arData + i;
}
- idx = Z_NEXT(prev->val);
}
}