]> granicus.if.org Git - php/commitdiff
Fixed bug #30162 (Catching exception in constructor couses lose of $this)
authorDmitry Stogov <dmitry@php.net>
Wed, 4 May 2005 08:45:46 +0000 (08:45 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 4 May 2005 08:45:46 +0000 (08:45 +0000)
Zend/tests/bug30161.phpt
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 038a151e0ead20a01628660b2f6fe2a9c6ef2dcb..22f8fb59e8bf1ceb8a7319507173799afa694fa5 100755 (executable)
@@ -20,7 +20,7 @@ class hariCow extends FIIFO {
         }
         
         public function __toString() {
-                return "Rusticus in asino sedet.";
+                return "ok\n";
         }
 
 }
@@ -31,3 +31,4 @@ $db = new hariCow;
 echo $db;
 ?>
 --EXPECT--
+ok
index e4774a8ee0b54d6c0f2535d82d44438c45ae3393..8aca967119a8930fcdf593efe80f306f056dd814 100644 (file)
@@ -1890,9 +1890,11 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
                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);
+                               zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
+                       }
+                       if (should_change_scope && EG(This) != current_this) {
+                               zval_ptr_dtor(&EG(This));
                        }
-                       zval_ptr_dtor(&EG(This));
                } else if (should_change_scope) {
                        zval_ptr_dtor(&EG(This));
                }
index 174f577000a26c1bda260b7d7a325d9171957a19..cdbe7596b4b41ccb9fbe426a3090b0fb4c8a1489 100644 (file)
@@ -254,9 +254,11 @@ static int zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
                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);
+                               zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
+                       }
+                       if (should_change_scope && EG(This) != current_this) {
+                               zval_ptr_dtor(&EG(This));
                        }
-                       zval_ptr_dtor(&EG(This));
                } else if (should_change_scope) {
                        zval_ptr_dtor(&EG(This));
                }
@@ -30823,9 +30825,11 @@ static int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS)
                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);
+                               zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
+                       }
+                       if (should_change_scope && EG(This) != current_this) {
+                               zval_ptr_dtor(&EG(This));
                        }
-                       zval_ptr_dtor(&EG(This));
                } else if (should_change_scope) {
                        zval_ptr_dtor(&EG(This));
                }