diff options
| author | Dmitry Stogov <dmitry@php.net> | 2006-07-12 07:54:00 +0000 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@php.net> | 2006-07-12 07:54:00 +0000 |
| commit | 8bb047ee977936b10d8e415d18e9a82b87b0af15 (patch) | |
| tree | 0fb7ef80424713b9c0228585fb6e06dcf2f80f56 /Zend/zend_execute_API.c | |
| parent | 39a4078b8c89c318e2ce366934d79fba2a09ee85 (diff) | |
| download | php-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.c | 14 |
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 */ |
