]> granicus.if.org Git - php/commitdiff
Fix bug #69740
authorNikita Popov <nikic@php.net>
Thu, 11 Jun 2015 15:40:10 +0000 (17:40 +0200)
committerNikita Popov <nikic@php.net>
Thu, 11 Jun 2015 15:40:10 +0000 (17:40 +0200)
NEWS
Zend/tests/bug69740.phpt [new file with mode: 0644]
Zend/zend_generators.c

diff --git a/NEWS b/NEWS
index 1cec854b092cc5a8557278b1007a23b8f1079245..90e051c2c920c47e5c9d75baa8274adfda104316 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,8 @@ PHP                                                                        NEWS
     fault). (Christoph M. Becker)
   . Fixed bug #69781 (phpinfo() reports Professional Editions of Windows
     7/8/8.1/10 as "Business"). (Christian Wenz)
+  . Fixed bug #69740 (finally in generator (yield) swallows exception in
+    iteration). (Nikita)
 
 - PDO_pgsql:
   . Fixed bug #69752 (PDOStatement::execute() leaks memory with DML
diff --git a/Zend/tests/bug69740.phpt b/Zend/tests/bug69740.phpt
new file mode 100644 (file)
index 0000000..30a2a49
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+Bug #69740: finally in generator (yield) swallows exception in iteration
+--FILE--
+<?php
+
+function generate() {
+    try {
+        yield 1;
+        yield 2;
+    } finally {
+        echo "finally\n";
+    }
+}
+
+foreach (generate() as $i) {
+    echo $i, "\n";
+    throw new Exception();
+}
+
+?>
+--EXPECTF--
+1
+finally
+
+Fatal error: Uncaught exception 'Exception' in %s:%d
+Stack trace:
+#0 {main}
+  thrown in %s on line %d
index 4b18f4221dc3bed996a2efd4d63229310c8d62d3..1cf9566ea556589ecbb2508a668ed295d576e576 100644 (file)
@@ -198,6 +198,9 @@ static void zend_generator_dtor_storage(zend_generator *generator, zend_object_h
        if (finally_op_num) {
                ex->opline = &ex->op_array->opcodes[finally_op_num];
                ex->fast_ret = NULL;
+               ex->delayed_exception = EG(exception);
+               EG(exception) = NULL;
+
                generator->flags |= ZEND_GENERATOR_FORCED_CLOSE;
                zend_generator_resume(generator TSRMLS_CC);
        }