summaryrefslogtreecommitdiff
path: root/Zend/zend_hash.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_hash.c')
-rw-r--r--Zend/zend_hash.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index 285cc840f8..edb8da272f 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -71,7 +71,7 @@ ZEND_API ulong hashpjw(char *arKey, uint nKeyLength)
}
-ZEND_API int zend_hash_init(HashTable *ht, uint nSize, ulong(*pHashFunction) (char *arKey, uint nKeyLength), void (*pDestructor) (void *pData),int persistent)
+ZEND_API int zend_hash_init(HashTable *ht, uint nSize, ulong(*pHashFunction) (char *arKey, uint nKeyLength), int (*pDestructor) (void *pData),int persistent)
{
uint i;
@@ -720,6 +720,7 @@ ZEND_API int zend_hash_del_key_or_index(HashTable *ht, char *arKey, uint nKeyLen
ZEND_API void zend_hash_destroy(HashTable *ht)
{
Bucket *p, *q;
+ int delete_bucket;
p = ht->pListHead;
while (p != NULL) {
@@ -727,13 +728,19 @@ ZEND_API void zend_hash_destroy(HashTable *ht)
p = p->pListNext;
if (!q->bIsPointer) {
if (ht->pDestructor) {
- ht->pDestructor(q->pData);
+ delete_bucket = ht->pDestructor(q->pData);
+ } else {
+ delete_bucket = 1;
}
if (!q->pDataPtr && q->pData) {
pefree(q->pData,ht->persistent);
}
+ } else {
+ delete_bucket = 1;
+ }
+ if (delete_bucket) {
+ pefree(q,ht->persistent);
}
- pefree(q,ht->persistent);
}
pefree(ht->arBuckets,ht->persistent);
}