@@ -321,7 +321,7 @@ static void zend_fiber_switch_to(zend_fiber *fiber)
321
321
322
322
zend_observer_fiber_switch_notify (fiber , previous );
323
323
324
- if (UNEXPECTED (fiber -> status == ZEND_FIBER_STATUS_BAILOUT )) {
324
+ if (UNEXPECTED (fiber -> flags & ZEND_FIBER_FLAG_BAILOUT )) {
325
325
// zend_bailout() was called in the fiber, so call it again in the previous fiber or {main}.
326
326
zend_bailout ();
327
327
}
@@ -379,20 +379,20 @@ static void ZEND_STACK_ALIGNED zend_fiber_execute(zend_fiber_context *context)
379
379
zval_ptr_dtor (& fiber -> fci .function_name );
380
380
381
381
if (EG (exception )) {
382
- if (fiber -> status == ZEND_FIBER_STATUS_SHUTDOWN ) {
382
+ if (fiber -> flags & ZEND_FIBER_FLAG_DESTROYED ) {
383
383
if (EXPECTED (zend_is_graceful_exit (EG (exception )) || zend_is_unwind_exit (EG (exception )))) {
384
384
zend_clear_exception ();
385
385
}
386
386
} else {
387
- fiber -> status = ZEND_FIBER_STATUS_THREW ;
387
+ fiber -> flags = ZEND_FIBER_FLAG_THREW ;
388
388
}
389
- } else {
390
- fiber -> status = ZEND_FIBER_STATUS_RETURNED ;
391
389
}
392
390
} zend_catch {
393
- fiber -> status = ZEND_FIBER_STATUS_BAILOUT ;
391
+ fiber -> flags |= ZEND_FIBER_FLAG_BAILOUT ;
394
392
} zend_end_try ();
395
393
394
+ fiber -> status = ZEND_FIBER_STATUS_DEAD ;
395
+
396
396
zend_vm_stack_destroy ();
397
397
fiber -> execute_data = NULL ;
398
398
fiber -> stack_bottom = NULL ;
@@ -422,7 +422,8 @@ static void zend_fiber_object_destroy(zend_object *object)
422
422
zend_object * exception = EG (exception );
423
423
EG (exception ) = NULL ;
424
424
425
- fiber -> status = ZEND_FIBER_STATUS_SHUTDOWN ;
425
+ fiber -> status = ZEND_FIBER_STATUS_RUNNING ;
426
+ fiber -> flags |= ZEND_FIBER_FLAG_DESTROYED ;
426
427
427
428
zend_fiber_switch_to (fiber );
428
429
@@ -499,7 +500,7 @@ ZEND_API void zend_fiber_start(zend_fiber *fiber, zval *params, uint32_t param_c
499
500
500
501
zend_fiber_switch_to (fiber );
501
502
502
- if (fiber -> status & ZEND_FIBER_STATUS_FINISHED ) {
503
+ if (fiber -> status == ZEND_FIBER_STATUS_DEAD ) {
503
504
RETURN_NULL ();
504
505
}
505
506
@@ -530,7 +531,7 @@ ZEND_API void zend_fiber_suspend(zval *value, zval *return_value)
530
531
RETURN_THROWS ();
531
532
}
532
533
533
- if (UNEXPECTED (fiber -> status == ZEND_FIBER_STATUS_SHUTDOWN )) {
534
+ if (UNEXPECTED (fiber -> flags & ZEND_FIBER_FLAG_DESTROYED )) {
534
535
zend_throw_error (zend_ce_fiber_error , "Cannot suspend in a force-closed fiber" );
535
536
RETURN_THROWS ();
536
537
}
@@ -549,7 +550,7 @@ ZEND_API void zend_fiber_suspend(zval *value, zval *return_value)
549
550
550
551
zend_fiber_suspend_from (fiber );
551
552
552
- if (fiber -> status == ZEND_FIBER_STATUS_SHUTDOWN ) {
553
+ if (fiber -> flags & ZEND_FIBER_FLAG_DESTROYED ) {
553
554
// This occurs when the fiber is GC'ed while suspended.
554
555
zend_throw_graceful_exit ();
555
556
RETURN_THROWS ();
@@ -599,7 +600,7 @@ ZEND_API void zend_fiber_resume(zend_fiber *fiber, zval *value, zval *return_val
599
600
600
601
zend_fiber_switch_to (fiber );
601
602
602
- if (fiber -> status & ZEND_FIBER_STATUS_FINISHED ) {
603
+ if (fiber -> status == ZEND_FIBER_STATUS_DEAD ) {
603
604
RETURN_NULL ();
604
605
}
605
606
@@ -637,7 +638,7 @@ ZEND_API void zend_fiber_throw(zend_fiber *fiber, zval *exception, zval *return_
637
638
638
639
zend_fiber_switch_to (fiber );
639
640
640
- if (fiber -> status & ZEND_FIBER_STATUS_FINISHED ) {
641
+ if (fiber -> status == ZEND_FIBER_STATUS_DEAD ) {
641
642
RETURN_NULL ();
642
643
}
643
644
@@ -700,7 +701,7 @@ ZEND_METHOD(Fiber, isTerminated)
700
701
701
702
fiber = (zend_fiber * ) Z_OBJ_P (getThis ());
702
703
703
- RETURN_BOOL (fiber -> status & ZEND_FIBER_STATUS_FINISHED );
704
+ RETURN_BOOL (fiber -> status == ZEND_FIBER_STATUS_DEAD );
704
705
}
705
706
706
707
ZEND_METHOD (Fiber , getReturn )
@@ -711,13 +712,15 @@ ZEND_METHOD(Fiber, getReturn)
711
712
712
713
fiber = (zend_fiber * ) Z_OBJ_P (getThis ());
713
714
714
- if (fiber -> status != ZEND_FIBER_STATUS_RETURNED ) {
715
+ if (fiber -> status != ZEND_FIBER_STATUS_DEAD || fiber -> flags ) {
715
716
const char * message ;
716
717
717
718
if (fiber -> status == ZEND_FIBER_STATUS_INIT ) {
718
719
message = "The fiber has not been started" ;
719
- } else if (fiber -> status == ZEND_FIBER_STATUS_THREW ) {
720
+ } else if (fiber -> flags & ZEND_FIBER_FLAG_THREW ) {
720
721
message = "The fiber threw an exception" ;
722
+ } else if (fiber -> flags & ZEND_FIBER_FLAG_BAILOUT ) {
723
+ message = "The fiber exited with a fatal error" ;
721
724
} else {
722
725
message = "The fiber has not returned" ;
723
726
}
0 commit comments