diff options
-rw-r--r-- | Zend/zend_execute.c | 3 | ||||
-rw-r--r-- | Zend/zend_objects_API.c | 9 | ||||
-rw-r--r-- | Zend/zend_objects_API.h | 1 |
3 files changed, 13 insertions, 0 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9d997576ea..1c84067d1d 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); |