Fixed bug #70965 (yield from with a common iterator primes too much)

This commit is contained in:
Bob Weinand 2015-11-25 09:49:39 +01:00
parent 2bae178b35
commit 73a92964ff
2 changed files with 37 additions and 5 deletions

View File

@ -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)

View File

@ -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;