summaryrefslogtreecommitdiff
path: root/Zend/zend_execute_API.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2006-07-12 07:54:00 +0000
committerDmitry Stogov <dmitry@php.net>2006-07-12 07:54:00 +0000
commit8bb047ee977936b10d8e415d18e9a82b87b0af15 (patch)
tree0fb7ef80424713b9c0228585fb6e06dcf2f80f56 /Zend/zend_execute_API.c
parent39a4078b8c89c318e2ce366934d79fba2a09ee85 (diff)
downloadphp-git-8bb047ee977936b10d8e415d18e9a82b87b0af15.tar.gz
Fixed bug #36759 (Objects destructors are invoked in wrong order when script is finished).
Diffstat (limited to 'Zend/zend_execute_API.c')
-rw-r--r--Zend/zend_execute_API.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 142cc0e371..4170a30e7c 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -190,8 +190,22 @@ void init_executor(TSRMLS_D)
EG(This) = NULL;
}
+static int zval_call_destructor(zval **zv TSRMLS_DC)
+{
+ if (Z_TYPE_PP(zv) == IS_OBJECT && (*zv)->refcount == 1) {
+ return ZEND_HASH_APPLY_REMOVE;
+ } else {
+ return ZEND_HASH_APPLY_KEEP;
+ }
+}
+
void shutdown_destructors(TSRMLS_D) {
zend_try {
+ int symbols;
+ do {
+ symbols = zend_hash_num_elements(&EG(symbol_table));
+ zend_hash_reverse_apply(&EG(symbol_table), (apply_func_t) zval_call_destructor TSRMLS_CC);
+ } while (symbols != zend_hash_num_elements(&EG(symbol_table)));
zend_objects_store_call_destructors(&EG(objects_store) TSRMLS_CC);
} zend_catch {
/* if we couldn't destruct cleanly, mark all objects as destructed anyway */