summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Weinand <bobwei9@hotmail.com>2017-07-01 11:52:41 +0200
committerBob Weinand <bobwei9@hotmail.com>2017-07-01 11:52:41 +0200
commitaf7bfc71fd8ac2c2a4135b7805370fae2b08533f (patch)
treef5e0d09aa2a07811f173f608d7d82ca19a449e20
parent72f71432954f4ddca9e4df0b3951eacabe73c2bb (diff)
parente3cc15daf2abc1b4886d4888c3bf5ca9cef035c8 (diff)
downloadphp-git-af7bfc71fd8ac2c2a4135b7805370fae2b08533f.tar.gz
Merge branch 'PHP-7.0' into PHP-7.1
-rw-r--r--Zend/tests/bug74840.phpt21
-rw-r--r--ext/opcache/Optimizer/optimize_temp_vars_5.c1
2 files changed, 22 insertions, 0 deletions
diff --git a/Zend/tests/bug74840.phpt b/Zend/tests/bug74840.phpt
new file mode 100644
index 0000000000..68e27cba84
--- /dev/null
+++ b/Zend/tests/bug74840.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #74840: Opcache overwrites argument of GENERATOR_RETURN within finally
+--FILE--
+<?php
+
+$g = (function($a) {
+ try {
+ return $a + 1;
+ } finally {
+ $b = $a + 2;
+ var_dump($b);
+ }
+ yield; // Generator
+})(1);
+$g->next();
+var_dump($g->getReturn());
+
+?>
+--EXPECT--
+int(3)
+int(2)
diff --git a/ext/opcache/Optimizer/optimize_temp_vars_5.c b/ext/opcache/Optimizer/optimize_temp_vars_5.c
index 08ab915e92..930a926a0e 100644
--- a/ext/opcache/Optimizer/optimize_temp_vars_5.c
+++ b/ext/opcache/Optimizer/optimize_temp_vars_5.c
@@ -109,6 +109,7 @@ void zend_optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_c
*/
if ((op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) &&
(opline->opcode == ZEND_RETURN ||
+ opline->opcode == ZEND_GENERATOR_RETURN ||
opline->opcode == ZEND_RETURN_BY_REF ||
opline->opcode == ZEND_FREE ||
opline->opcode == ZEND_FE_FREE)) {