Skip to content

Commit c2f8b57

Browse files
committed
Fix GH-23301: nested "yield from" yields a value twice when the middle generator ends with "yield from []"
1 parent fa317bf commit c2f8b57

3 files changed

Lines changed: 32 additions & 1 deletion

File tree

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ PHP NEWS
55
- Core:
66
. Fixed bug GH-15375 (Nested "yield from" skips items after a valid() or
77
next() call on the inner generator). (iliaal)
8+
. Fixed bug GH-23301 (Nested "yield from" yields a value twice when the
9+
middle generator ends with "yield from []"). (Lazizbek Ergashev)
810

911
- Opcache:
1012
. Fixed opcache.protect_memory race under ZTS. (realFlowControl)

Zend/tests/generators/gh23301.phpt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
--TEST--
2+
GH-23301 (Nested "yield from" yields a value twice when the middle generator ends with "yield from []")
3+
--FILE--
4+
<?php
5+
6+
function inner() {
7+
yield "B";
8+
}
9+
10+
function middle() {
11+
yield "A";
12+
yield from inner();
13+
yield "C";
14+
yield from [];
15+
}
16+
17+
function outer() {
18+
yield from middle();
19+
}
20+
21+
foreach (outer() as $value) {
22+
echo $value, "\n";
23+
}
24+
25+
?>
26+
--EXPECT--
27+
A
28+
B
29+
C

Zend/zend_generators.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -890,7 +890,7 @@ ZEND_API void zend_generator_resume(zend_generator *orig_generator) /* {{{ */
890890

891891
/* yield from was used, try another resume. */
892892
if (UNEXPECTED(generator->execute_data && generator->execute_data->opline->opcode == ZEND_YIELD_FROM)) {
893-
delegator = generator;
893+
delegator = generator->node.parent ? generator : orig_generator;
894894
generator = zend_generator_get_current(orig_generator);
895895
goto try_again;
896896
}

0 commit comments

Comments
 (0)