com php-src: Fixed zend_hash_del(): Zend/zend_has h.c Zend/zend_types.h

From: Date: Tue, 17 Mar 2015 20:13:39 +0000
Subject: com php-src: Fixed zend_hash_del(): Zend/zend_has h.c Zend/zend_types.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-85556@lists.php.net to get a copy of this message
Commit: 55da1fb00809f43f1f3a03831573d81e04ba9e63 Author: Dmitry Stogov <dmitry@zend.com> Tue, 17 Mar 2015 23:13:39 +0300 Parents: 4d4a5336f149fc0d49ac8fa10f0f85fa364366ac Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=55da1fb00809f43f1f3a03831573d81e04ba9e63 Log: Fixed zend_hash_del() Changed paths: M Zend/zend_hash.c M Zend/zend_types.h Diff: diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index a00f46e..8524281 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -807,6 +807,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht) if (UNEXPECTED(ht->nNumOfElements == 0)) { if (ht->u.flags & HASH_FLAG_INITIALIZED) { + ht->nNumUsed = 0; HT_HASH_RESET(ht); } return SUCCESS; @@ -864,15 +865,16 @@ static zend_always_inline void _zend_hash_del_el_ex(HashTable *ht, uint32_t idx, HT_HASH(ht, p->h | ht->nTableMask) = Z_NEXT(p->val); } } - if (ht->nNumUsed - 1 == idx) { + if (HT_IDX_TO_HASH(ht->nNumUsed - 1) == idx) { do { ht->nNumUsed--; } while (ht->nNumUsed > 0 && (Z_TYPE(ht->arData[ht->nNumUsed-1].val) == IS_UNDEF)); } ht->nNumOfElements--; - if (ht->nInternalPointer == idx || UNEXPECTED(ht->u.v.nIteratorsCount)) { - uint32_t new_idx = idx; + if (HT_IDX_TO_HASH(ht->nInternalPointer) == idx || UNEXPECTED(ht->u.v.nIteratorsCount)) { + uint32_t new_idx; + new_idx = idx = HT_HASH_TO_IDX(idx); while (1) { new_idx++; if (new_idx >= ht->nNumUsed) { @@ -1083,7 +1085,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h) if (h < ht->nNumUsed) { p = ht->arData + h; if (Z_TYPE(p->val) != IS_UNDEF) { - _zend_hash_del_el_ex(ht, h, p, NULL); + _zend_hash_del_el_ex(ht, HT_IDX_TO_HASH(h), p, NULL); return SUCCESS; } } diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 0956094..3f1258f 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -209,12 +209,16 @@ struct _zend_array { ((Bucket*)((char*)(data) + (idx))) # define HT_IDX_TO_HASH(idx) \ ((idx) * sizeof(Bucket)) +# define HT_HASH_TO_IDX(idx) \ + ((idx) / sizeof(Bucket)) #elif SIZEOF_SIZE_T == 8 # define HT_MAX_SIZE 0x80000000 # define HT_HASH_TO_BUCKET_EX(data, idx) \ ((data) + (idx)) # define HT_IDX_TO_HASH(idx) \ (idx) +# define HT_HASH_TO_IDX(idx) \ + (idx) #else # error "Unknown SIZEOF_SIZE_T" #endif

« previous php.cvs (#85556) next »