From: Marcus Boerger Date: Sun, 25 Jul 2004 17:37:55 +0000 (+0000) Subject: - MFH: Fix bug #29368 : The destructor is called when an exception is X-Git-Tag: php-5.0.1RC1~78 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8588815ef33d0aed68cd2baf1201411240cc28c7;p=php - MFH: Fix bug #29368 : The destructor is called when an exception is thrown from the constructor --- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index a958a1be60..24094fb55b 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2777,6 +2777,9 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS) if (EG(This)) { if (EG(exception) && EX(fbc) && EX(fbc)->common.fn_flags&ZEND_ACC_CTOR) { EG(This)->refcount--; + if (EG(This)->refcount == 1) { + zend_object_store_ctor_failed(EG(This) TSRMLS_CC); + } zval_ptr_dtor(&EG(This)); } else if (should_change_scope) { zval_ptr_dtor(&EG(This)); diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index a5788bd437..33225da4db 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -207,6 +207,15 @@ ZEND_API void zend_object_store_set_object(zval *zobject, void *object TSRMLS_DC } +/* Called when the ctor was terminated by an exception */ +ZEND_API void zend_object_store_ctor_failed(zval *zobject TSRMLS_DC) +{ + zend_object_handle handle = Z_OBJ_HANDLE_P(zobject); + + EG(objects_store).object_buckets[handle].destructor_called = 1; +} + + /* Proxy objects workings */ typedef struct _zend_proxy_object { zval *object; diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h index bcca11b0f2..189ab9c5ec 100644 --- a/Zend/zend_objects_API.h +++ b/Zend/zend_objects_API.h @@ -68,6 +68,7 @@ ZEND_API zend_object_value zend_objects_store_clone_obj(zval *object TSRMLS_DC); ZEND_API void *zend_object_store_get_object(zval *object TSRMLS_DC); /* See comment in zend_objects_API.c before you use this */ ZEND_API void zend_object_store_set_object(zval *zobject, void *object TSRMLS_DC); +ZEND_API void zend_object_store_ctor_failed(zval *zobject TSRMLS_DC); ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects TSRMLS_DC);