summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2015-06-11 17:44:51 +0200
committerNikita Popov <nikic@php.net>2015-06-11 17:44:51 +0200
commit580eb56fb78456144918c3053676c46cd2cee529 (patch)
treef42534e57be7790b89ddee3cb1453af3875fec3e /Zend
parent8cfe28259ed0b0bebb72d8292abc877181b84d34 (diff)
parent8405265578d2df8d76be223910b3e44aff4bdfef (diff)
downloadphp-git-580eb56fb78456144918c3053676c46cd2cee529.tar.gz
Merge branch 'PHP-5.6'
Conflicts: Zend/zend_generators.c
Diffstat (limited to 'Zend')
-rw-r--r--Zend/tests/bug69740.phpt28
-rw-r--r--Zend/zend_generators.c4
2 files changed, 31 insertions, 1 deletions
diff --git a/Zend/tests/bug69740.phpt b/Zend/tests/bug69740.phpt
new file mode 100644
index 0000000000..c8910b22d8
--- /dev/null
+++ b/Zend/tests/bug69740.phpt
@@ -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 in %s:%d
+Stack trace:
+#0 {main}
+ thrown in %s on line %d
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index 706d913f72..13304e9fdd 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -176,8 +176,10 @@ static void zend_generator_dtor_storage(zend_object *object) /* {{{ */
if (finally_op_num) {
zval *fast_call = ZEND_CALL_VAR(ex, ex->func->op_array.opcodes[finally_op_end].op1.var);
- Z_OBJ_P(fast_call) = NULL;
+ Z_OBJ_P(fast_call) = EG(exception);
+ EG(exception) = NULL;
fast_call->u2.lineno = (uint32_t)-1;
+
ex->opline = &ex->func->op_array.opcodes[finally_op_num];
generator->flags |= ZEND_GENERATOR_FORCED_CLOSE;
zend_generator_resume(generator);