mirror of
https://github.com/php/php-src.git
synced 2024-09-21 09:57:23 +00:00
Fixed bug #70965 (yield from with a common iterator primes too much)
This commit is contained in:
parent
2bae178b35
commit
73a92964ff
32
Zend/tests/generators/bug70965.phpt
Normal file
32
Zend/tests/generators/bug70965.phpt
Normal 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)
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user