com php-src: Fixed bug #70965 (yield from with a common iterator primes too much): Zend/tests/generators/bug70965.phpt Zend/zend_generato rs.c
| From: | Bob Weinand | Date: | Wed, 25 Nov 2015 08:54:24 +0000 |
| Subject: | com php-src: Fixed bug #70965 (yield from with a common iterator primes too much): Zend/tests/generators/bug70965.phpt Zend/zend_generato rs.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-90020@lists.php.net to get a copy of this message | ||
Commit: 73a92964ffd80ae907314b8202ed99716e4ba918
Author: Bob Weinand <bobwei9@hotmail.com> Wed, 25 Nov 2015 09:49:39 +0100
Parents: 2bae178b35189d79f32f5834fdf561ed950105c4
Branches: PHP-7.0
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=73a92964ffd80ae907314b8202ed99716e4ba918
Log:
Fixed bug #70965 (yield from with a common iterator primes too much)
Bugs:
https://bugs.php.net/70965
Changed paths:
A Zend/tests/generators/bug70965.phpt
M Zend/zend_generators.c
Diff:
diff --git a/Zend/tests/generators/bug70965..phpt b/Zend/tests/generators/bug70965.phpt
new file mode 100644
index 0000000..4ed34fd
--- /dev/null
+++ b/Zend/tests/generators/bug70965.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Bug #70965 (yield from with a common iterator primes too much)
+--FILE--
+<?php
+
+function it() {
+ yield from [1, 2, 3, 4, 5];
+}
+
+function bar($g) {
+ yield from $g;
+}
+
+$gen = it();
+$gens[] = bar($gen);
+$gens[] = bar($gen);
+
+do {
+ foreach($gens as $g) {
+ var_dump($g->current());
+ $gen->next();
+ }
+} while ($gen->valid());
+
+?>
+--EXPECT--
+int(1)
+int(2)
+int(3)
+int(4)
+int(5)
+int(5)
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index 5502633..9ef63df 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -621,6 +621,11 @@ try_again:
return;
}
+ if (UNEXPECTED((orig_generator->flags & ZEND_GENERATOR_DO_INIT) != 0 &&
!Z_ISUNDEF(generator->value))) {
+ /* We must not advance Generator if we yield from a Generator being currently run */
+ return;
+ }
+
if (UNEXPECTED(!Z_ISUNDEF(generator->values))) {
if (EXPECTED(zend_generator_get_next_delegated_value(generator) == SUCCESS)) {
return;
@@ -629,11 +634,6 @@ try_again:
* after the "yield from" expression. */
}
- if (UNEXPECTED((orig_generator->flags & ZEND_GENERATOR_DO_INIT) != 0 &&
!Z_ISUNDEF(generator->value))) {
- /* We must not advance Generator if we yield from a Generator being currently run */
- return;
- }
-
/* Drop the AT_FIRST_YIELD flag */
orig_generator->flags &= ~ZEND_GENERATOR_AT_FIRST_YIELD;