File tree Expand file tree Collapse file tree 3 files changed +45
-2
lines changed Expand file tree Collapse file tree 3 files changed +45
-2
lines changed Original file line number Diff line number Diff line change @@ -17,6 +17,8 @@ PHP NEWS
1717 (Arnaud)
1818 . Fixed bug GH-19303 (Unpacking empty packed array into uninitialized array
1919 causes assertion failure). (nielsdos)
20+ . Fixed bug GH-19306 (Generator can be resumed while fetching next value from
21+ delegated Generator). (Arnaud)
2022
2123- FTP:
2224 . Fix theoretical issues with hrtime() not being available. (nielsdos)
Original file line number Diff line number Diff line change 1+ --TEST--
2+ GH-19306: Generator suspended in yield from may be resumed
3+ --FILE--
4+ <?php
5+
6+ class It implements IteratorAggregate
7+ {
8+ public function getIterator (): Generator
9+ {
10+ yield "" ;
11+ Fiber::suspend ();
12+ }
13+ }
14+ function g ()
15+ {
16+ yield from new It ();
17+ }
18+ $ a = g ();
19+ $ fiber = new Fiber (function () use ($ a ) {
20+ echo "Fiber start \n" ;
21+ $ a ->next ();
22+ echo "Fiber return \n" ;
23+ });
24+ $ fiber ->start ();
25+ echo "Fiber suspended \n" ;
26+ try {
27+ $ a ->next ();
28+ } catch (Throwable $ t ) {
29+ echo $ t ->getMessage (), "\n" ;
30+ }
31+ echo "Destroying fiber \n" ;
32+ $ fiber = null ;
33+ echo "Shutdown \n" ;
34+ ?>
35+ --EXPECT--
36+ Fiber start
37+ Fiber suspended
38+ Cannot resume an already running generator
39+ Destroying fiber
40+ Shutdown
Original file line number Diff line number Diff line change @@ -786,6 +786,8 @@ ZEND_API void zend_generator_resume(zend_generator *orig_generator) /* {{{ */
786786 orig_generator -> execute_fake .prev_execute_data = original_execute_data ;
787787 }
788788
789+ generator -> flags |= ZEND_GENERATOR_CURRENTLY_RUNNING ;
790+
789791 /* Ensure this is run after executor_data swap to have a proper stack trace */
790792 if (UNEXPECTED (!Z_ISUNDEF (generator -> values ))) {
791793 if (EXPECTED (zend_generator_get_next_delegated_value (generator ) == SUCCESS )) {
@@ -794,7 +796,7 @@ ZEND_API void zend_generator_resume(zend_generator *orig_generator) /* {{{ */
794796 EG (jit_trace_num ) = original_jit_trace_num ;
795797
796798 orig_generator -> flags &= ~(ZEND_GENERATOR_DO_INIT | ZEND_GENERATOR_IN_FIBER );
797- generator -> flags &= ~ZEND_GENERATOR_IN_FIBER ;
799+ generator -> flags &= ~( ZEND_GENERATOR_CURRENTLY_RUNNING | ZEND_GENERATOR_IN_FIBER ) ;
798800 return ;
799801 }
800802 /* If there are no more delegated values, resume the generator
@@ -817,7 +819,6 @@ ZEND_API void zend_generator_resume(zend_generator *orig_generator) /* {{{ */
817819 * account for the following increment */
818820 || (generator -> flags & ZEND_GENERATOR_FORCED_CLOSE ));
819821 generator -> execute_data -> opline ++ ;
820- generator -> flags |= ZEND_GENERATOR_CURRENTLY_RUNNING ;
821822 if (!ZEND_OBSERVER_ENABLED ) {
822823 zend_execute_ex (generator -> execute_data );
823824 } else {
You can’t perform that action at this time.
0 commit comments