]> granicus.if.org Git - php/commitdiff
- MFH: Fix bug #29368 : The destructor is called when an exception is
authorMarcus Boerger <helly@php.net>
Sun, 25 Jul 2004 17:37:55 +0000 (17:37 +0000)
committerMarcus Boerger <helly@php.net>
Sun, 25 Jul 2004 17:37:55 +0000 (17:37 +0000)
  thrown from the constructor

Zend/zend_execute.c
Zend/zend_objects_API.c
Zend/zend_objects_API.h

index a958a1be6014ca6cde7a5183adeef6e9d7f6df71..24094fb55b2ab4c017031ee7bab5e768d394e6bf 100644 (file)
@@ -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));
index a5788bd437c3be868d64cc1d102fe5271f0f4bce..33225da4dbd457910bd7aca6d23c3256ce59c5da 100644 (file)
@@ -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;
index bcca11b0f264bad5b5e1b3b5e8a7d7d5655dd780..189ab9c5ec2544ab6732a1adcfde46c97b735468 100644 (file)
@@ -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);