diff options
-rw-r--r-- | Zend/zend_hash.c | 24 | ||||
-rw-r--r-- | Zend/zend_hash.h | 1 | ||||
-rw-r--r-- | Zend/zend_list.c | 4 |
3 files changed, 27 insertions, 2 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 425053fe2a..6cd2ea8e81 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -529,6 +529,30 @@ ZEND_API int zend_hash_del_key_or_index(HashTable *ht, char *arKey, uint nKeyLen return FAILURE; } +ZEND_API void zend_hash_reverse_destroy(HashTable *ht) +{ + Bucket *p, *q; + + while (1) { + p = ht->pListTail; + if (! p) + break; + q = p->pListLast; + if (q) + q->pListNext = NULL; + ht->pListTail = q; + + if (ht->pDestructor) { + ht->pDestructor(p->pData); + } + if (!p->pDataPtr && p->pData) { + pefree(p->pData, ht->persistent); + } + pefree(p, ht->persistent); + } + pefree(ht->arBuckets, ht->persistent); +} + ZEND_API void zend_hash_destroy(HashTable *ht) { diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 7b34ee5729..5639002994 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -81,6 +81,7 @@ BEGIN_EXTERN_C() ZEND_API int zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, int persistent); ZEND_API int zend_hash_init_ex(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, int persistent, zend_bool bApplyProtection); ZEND_API void zend_hash_destroy(HashTable *ht); +ZEND_API void zend_hash_reverse_destroy(HashTable *ht); ZEND_API void zend_hash_clean(HashTable *ht); diff --git a/Zend/zend_list.c b/Zend/zend_list.c index 0576556c5f..5f13b83937 100644 --- a/Zend/zend_list.c +++ b/Zend/zend_list.c @@ -231,13 +231,13 @@ int zend_init_rsrc_plist(ELS_D) void zend_destroy_rsrc_list(ELS_D) { - zend_hash_graceful_destroy(&EG(regular_list)); + zend_hash_reverse_destroy(&EG(regular_list)); } void zend_destroy_rsrc_plist(ELS_D) { - zend_hash_graceful_destroy(&EG(persistent_list)); + zend_hash_reverse_destroy(&EG(persistent_list)); } |