svn: /php/php-src/trunk/ Zend/tests/bug53511.phpt Zend/zend_vm_def.h Zend/zend_vm_execute.h ext/spl/tests/iterator_041b.phpt
| From: | Dmitry Stogov | Date: | Thu, 09 Dec 2010 16:38:37 +0000 |
| Subject: | svn: /php/php-src/trunk/ Zend/tests/bug53511.phpt Zend/zend_vm_def.h Zend/zend_vm_execute.h ext/spl/tests/iterator_041b.phpt | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-64061@lists.php.net to get a copy of this message | ||
dmitry Thu, 09 Dec 2010 16:38:37 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=306135
Log:
Fixed bug #53511 (Exceptions are lost in case an exception is thrown in catch operator)
Bug: http://bugs.php.net/53511 (Assigned) Exceptions are
lost in case an exception is thrown in catch operator
Changed paths:
A php/php-src/trunk/Zend/tests/bug53511.phpt
U php/php-src/trunk/Zend/zend_vm_def.h
U php/php-src/trunk/Zend/zend_vm_execute.h
U php/php-src/trunk/ext/spl/tests/iterator_041b.phpt
Added: php/php-src/trunk/Zend/tests/bug53511.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/bug53511.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/bug53511.phpt 2010-12-09 16:38:37 UTC (rev 306135)
@@ -0,0 +1,33 @@
+--TEST--
+Bug #53511 (Exceptions are lost in case an exception is thrown in catch operator)
+--FILE--
+<?php
+class Foo {
+ function __destruct() {
+ throw new Exception("ops 1");
+ }
+}
+
+function test() {
+ $e = new Foo();
+ try {
+ throw new Exception("ops 2");
+ } catch (Exception $e) {
+ echo $e->getMessage()."\n";
+ }
+}
+
+test();
+echo "bug\n";
+--EXPECTF--
+Fatal error: Uncaught exception 'Exception' with message 'ops 2' in
%sbug53511.php:11
+Stack trace:
+#0 %sbug53511.php(17): test()
+#1 {main}
+
+Next exception 'Exception' with message 'ops 1' in %sbug53511.php:4
+Stack trace:
+#0 %sbug53511.php(12): Foo->__destruct()
+#1 %sbug53511.php(17): test()
+#2 {main}
+ thrown in %sbug53511.php on line 4
Modified: php/php-src/trunk/Zend/zend_vm_def.h
===================================================================
--- php/php-src/trunk/Zend/zend_vm_def.h 2010-12-09 16:33:45 UTC (rev 306134)
+++ php/php-src/trunk/Zend/zend_vm_def.h 2010-12-09 16:38:37 UTC (rev 306135)
@@ -2918,7 +2918,7 @@
&EG(exception), sizeof(zval *), (void**)&EX_CV(opline->op2.var));
}
if (UNEXPECTED(EG(exception) != exception)) {
- EG(exception) = NULL;
+ Z_ADDREF_P(EG(exception));
HANDLE_EXCEPTION();
} else {
EG(exception) = NULL;
Modified: php/php-src/trunk/Zend/zend_vm_execute.h
===================================================================
--- php/php-src/trunk/Zend/zend_vm_execute.h 2010-12-09 16:33:45 UTC (rev 306134)
+++ php/php-src/trunk/Zend/zend_vm_execute.h 2010-12-09 16:38:37 UTC (rev 306135)
@@ -5843,7 +5843,7 @@
&EG(exception), sizeof(zval *), (void**)&EX_CV(opline->op2.var));
}
if (UNEXPECTED(EG(exception) != exception)) {
- EG(exception) = NULL;
+ Z_ADDREF_P(EG(exception));
HANDLE_EXCEPTION();
} else {
EG(exception) = NULL;
Modified: php/php-src/trunk/ext/spl/tests/iterator_041b.phpt
===================================================================
--- php/php-src/trunk/ext/spl/tests/iterator_041b.phpt 2010-12-09 16:33:45 UTC (rev 306134)
+++ php/php-src/trunk/ext/spl/tests/iterator_041b.phpt 2010-12-09 16:38:37 UTC (rev 306135)
@@ -82,6 +82,10 @@
{
self::$fail++;
}
+ try {
+ $e = null;
+ } catch (Exception $e) {
+ }
}
}
}
@@ -101,10 +105,19 @@
State 4: current()
State 5: key()
State 6: next()
+State 7: __destruct()
+array(2) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+}
===iterator_count===
State 0: __construct()
State 1: __construct()
State 2: rewind()
State 3: valid()
State 6: next()
+State 7: __destruct()
+int(2)
===DONE===