--- /dev/null
+--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)
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;
* 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;