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 @@ -11,6 +11,8 @@ PHP NEWS
11
11
. Added PHP_BUILD_PROVIDER constant. (timwolla)
12
12
. Fixed bug GH-19305 (Operands may be being released during comparison).
13
13
(Arnaud)
14
+ . Fixed bug GH-19306 (Generator can be resumed while fetching next value from
15
+ delegated Generator). (Arnaud)
14
16
15
17
- Curl:
16
18
. Add support for CURLINFO_CONN_ID in curl_getinfo() (thecaliskan)
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) /* {{{ */
786
786
orig_generator -> execute_fake .prev_execute_data = original_execute_data ;
787
787
}
788
788
789
+ generator -> flags |= ZEND_GENERATOR_CURRENTLY_RUNNING ;
790
+
789
791
/* Ensure this is run after executor_data swap to have a proper stack trace */
790
792
if (UNEXPECTED (!Z_ISUNDEF (generator -> values ))) {
791
793
if (EXPECTED (zend_generator_get_next_delegated_value (generator ) == SUCCESS )) {
@@ -794,7 +796,7 @@ ZEND_API void zend_generator_resume(zend_generator *orig_generator) /* {{{ */
794
796
EG (jit_trace_num ) = original_jit_trace_num ;
795
797
796
798
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 ) ;
798
800
return ;
799
801
}
800
802
/* If there are no more delegated values, resume the generator
@@ -817,7 +819,6 @@ ZEND_API void zend_generator_resume(zend_generator *orig_generator) /* {{{ */
817
819
* account for the following increment */
818
820
|| (generator -> flags & ZEND_GENERATOR_FORCED_CLOSE ));
819
821
generator -> execute_data -> opline ++ ;
820
- generator -> flags |= ZEND_GENERATOR_CURRENTLY_RUNNING ;
821
822
if (!ZEND_OBSERVER_ENABLED ) {
822
823
zend_execute_ex (generator -> execute_data );
823
824
} else {
You can’t perform that action at this time.
0 commit comments