summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_execute.c3
-rw-r--r--Zend/zend_objects_API.c9
-rw-r--r--Zend/zend_objects_API.h1
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);