@@ -343,7 +343,7 @@ ZEND_API void zend_fiber_switch_context(zend_fiber_transfer *transfer)
343343
344344 to -> status = ZEND_FIBER_STATUS_RUNNING ;
345345
346- if (from -> status == ZEND_FIBER_STATUS_RUNNING ) {
346+ if (EXPECTED ( from -> status == ZEND_FIBER_STATUS_RUNNING ) ) {
347347 from -> status = ZEND_FIBER_STATUS_SUSPENDED ;
348348 }
349349
@@ -381,11 +381,6 @@ ZEND_API void zend_fiber_switch_context(zend_fiber_transfer *transfer)
381381 if (to -> status == ZEND_FIBER_STATUS_DEAD ) {
382382 zend_fiber_destroy_context (to );
383383 }
384-
385- /* Propagate bailout to current fiber / main. */
386- if (UNEXPECTED (to -> flags & ZEND_FIBER_FLAG_BAILOUT )) {
387- zend_bailout ();
388- }
389384}
390385
391386static ZEND_STACK_ALIGNED void zend_fiber_execute (zend_fiber_transfer * transfer )
@@ -400,6 +395,7 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
400395 }
401396
402397 EG (vm_stack ) = NULL ;
398+ transfer -> flags = 0 ;
403399
404400 zend_first_try {
405401 zend_vm_stack stack = zend_vm_stack_new_page (ZEND_FIBER_VM_STACK_SIZE , NULL );
@@ -427,10 +423,10 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
427423 zval_ptr_dtor (& fiber -> fci .function_name );
428424
429425 if (EG (exception )) {
430- if (!(fiber -> context . flags & ZEND_FIBER_FLAG_DESTROYED )
426+ if (!(fiber -> flags & ZEND_FIBER_FLAG_DESTROYED )
431427 || !(zend_is_graceful_exit (EG (exception )) || zend_is_unwind_exit (EG (exception )))
432428 ) {
433- fiber -> context . flags |= ZEND_FIBER_FLAG_THREW ;
429+ fiber -> flags |= ZEND_FIBER_FLAG_THREW ;
434430 transfer -> flags = ZEND_FIBER_TRANSFER_FLAG_ERROR ;
435431
436432 ZVAL_OBJ_COPY (& transfer -> value , EG (exception ));
@@ -441,7 +437,8 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
441437 ZVAL_COPY (& transfer -> value , & fiber -> result );
442438 }
443439 } zend_catch {
444- fiber -> context .flags |= ZEND_FIBER_FLAG_BAILOUT ;
440+ fiber -> flags |= ZEND_FIBER_FLAG_BAILOUT ;
441+ transfer -> flags = ZEND_FIBER_TRANSFER_FLAG_BAILOUT ;
445442 } zend_end_try ();
446443
447444 transfer -> context = fiber -> caller ;
@@ -486,6 +483,11 @@ static zend_always_inline zend_fiber_transfer zend_fiber_switch_to(
486483
487484 zend_fiber_switch_context (& transfer );
488485
486+ /* Forward bailout into current fiber. */
487+ if (UNEXPECTED (transfer .flags & ZEND_FIBER_TRANSFER_FLAG_BAILOUT )) {
488+ zend_bailout ();
489+ }
490+
489491 return transfer ;
490492}
491493
@@ -538,7 +540,7 @@ static void zend_fiber_object_destroy(zend_object *object)
538540 zend_object * exception = EG (exception );
539541 EG (exception ) = NULL ;
540542
541- fiber -> context . flags |= ZEND_FIBER_FLAG_DESTROYED ;
543+ fiber -> flags |= ZEND_FIBER_FLAG_DESTROYED ;
542544
543545 zend_fiber_transfer transfer = zend_fiber_resume (fiber , NULL , false);
544546
@@ -639,7 +641,7 @@ ZEND_METHOD(Fiber, suspend)
639641 RETURN_THROWS ();
640642 }
641643
642- if (UNEXPECTED (fiber -> context . flags & ZEND_FIBER_FLAG_DESTROYED )) {
644+ if (UNEXPECTED (fiber -> flags & ZEND_FIBER_FLAG_DESTROYED )) {
643645 zend_throw_error (zend_ce_fiber_error , "Cannot suspend in a force-closed fiber" );
644646 RETURN_THROWS ();
645647 }
@@ -656,7 +658,7 @@ ZEND_METHOD(Fiber, suspend)
656658
657659 zend_fiber_transfer transfer = zend_fiber_suspend (fiber , value );
658660
659- if (fiber -> context . flags & ZEND_FIBER_FLAG_DESTROYED ) {
661+ if (fiber -> flags & ZEND_FIBER_FLAG_DESTROYED ) {
660662 // This occurs when the fiber is GC'ed while suspended.
661663 zval_ptr_dtor (& transfer .value );
662664 zend_throw_graceful_exit ();
@@ -777,9 +779,9 @@ ZEND_METHOD(Fiber, getReturn)
777779 fiber = (zend_fiber * ) Z_OBJ_P (getThis ());
778780
779781 if (fiber -> context .status == ZEND_FIBER_STATUS_DEAD ) {
780- if (fiber -> context . flags & ZEND_FIBER_FLAG_THREW ) {
782+ if (fiber -> flags & ZEND_FIBER_FLAG_THREW ) {
781783 message = "The fiber threw an exception" ;
782- } else if (fiber -> context . flags & ZEND_FIBER_FLAG_BAILOUT ) {
784+ } else if (fiber -> flags & ZEND_FIBER_FLAG_BAILOUT ) {
783785 message = "The fiber exited with a fatal error" ;
784786 } else {
785787 RETURN_COPY (& fiber -> result );
0 commit comments