summaryrefslogtreecommitdiff
path: root/Zend/zend_hash.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2006-08-24 09:42:35 +0000
committerDmitry Stogov <dmitry@php.net>2006-08-24 09:42:35 +0000
commitc42b3bf689389ae0f22448183c77dc96c7114bd2 (patch)
treeb669cf99fb9aa91c85ac0aee43cff7051bf4cc9a /Zend/zend_hash.c
parent92f1b46fbba7873c1256d64eac2dac5f7ffc7c1b (diff)
downloadphp-git-c42b3bf689389ae0f22448183c77dc96c7114bd2.tar.gz
Fixed bug #38315 (Constructing in the destructor causes weird behaviour)
Diffstat (limited to 'Zend/zend_hash.c')
-rw-r--r--Zend/zend_hash.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index 806a5d6f88..e5e127f0f5 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -571,15 +571,6 @@ static Bucket *zend_hash_apply_deleter(HashTable *ht, Bucket *p)
Bucket *retval;
HANDLE_BLOCK_INTERRUPTIONS();
-
- if (ht->pDestructor) {
- ht->pDestructor(p->pData);
- }
- if (p->pData != &p->pDataPtr) {
- pefree(p->pData, ht->persistent);
- }
- retval = p->pListNext;
-
if (p->pLast) {
p->pLast->pNext = p->pNext;
} else {
@@ -608,9 +599,17 @@ static Bucket *zend_hash_apply_deleter(HashTable *ht, Bucket *p)
if (ht->pInternalPointer == p) {
ht->pInternalPointer = p->pListNext;
}
- pefree(p, ht->persistent);
- HANDLE_UNBLOCK_INTERRUPTIONS();
ht->nNumOfElements--;
+ HANDLE_UNBLOCK_INTERRUPTIONS();
+
+ if (ht->pDestructor) {
+ ht->pDestructor(p->pData);
+ }
+ if (p->pData != &p->pDataPtr) {
+ pefree(p->pData, ht->persistent);
+ }
+ retval = p->pListNext;
+ pefree(p, ht->persistent);
return retval;
}