From 8bb047ee977936b10d8e415d18e9a82b87b0af15 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 12 Jul 2006 07:54:00 +0000 Subject: Fixed bug #36759 (Objects destructors are invoked in wrong order when script is finished). --- Zend/zend_execute_API.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'Zend/zend_execute_API.c') 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 */ -- cgit v1.2.1