summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_hash.c24
-rw-r--r--Zend/zend_hash.h1
-rw-r--r--Zend/zend_list.c4
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));
}