@@ -392,10 +392,10 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
392
392
zval_ptr_dtor (& fiber -> fci .function_name );
393
393
394
394
if (EG (exception )) {
395
- if (!(fiber -> flags & ZEND_FIBER_FLAG_DESTROYED )
395
+ if (!(fiber -> context . flags & ZEND_FIBER_FLAG_DESTROYED )
396
396
|| !(zend_is_graceful_exit (EG (exception )) || zend_is_unwind_exit (EG (exception )))
397
397
) {
398
- fiber -> flags |= ZEND_FIBER_FLAG_THREW ;
398
+ fiber -> context . flags |= ZEND_FIBER_FLAG_THREW ;
399
399
transfer -> flags = ZEND_FIBER_TRANSFER_FLAG_ERROR ;
400
400
401
401
ZVAL_OBJ_COPY (& transfer -> value , EG (exception ));
@@ -406,7 +406,7 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
406
406
ZVAL_COPY (& transfer -> value , & fiber -> result );
407
407
}
408
408
} zend_catch {
409
- fiber -> flags |= ZEND_FIBER_FLAG_BAILOUT ;
409
+ fiber -> context . flags |= ZEND_FIBER_FLAG_BAILOUT ;
410
410
} zend_end_try ();
411
411
412
412
transfer -> context = fiber -> caller ;
@@ -427,7 +427,7 @@ static zend_always_inline void delegate_transfer_result(
427
427
RETURN_THROWS ();
428
428
}
429
429
430
- if (fiber -> status == ZEND_FIBER_STATUS_DEAD ) {
430
+ if (fiber -> context . status == ZEND_FIBER_STATUS_DEAD ) {
431
431
zval_ptr_dtor (& transfer -> value );
432
432
RETURN_NULL ();
433
433
}
@@ -496,14 +496,14 @@ static void zend_fiber_object_destroy(zend_object *object)
496
496
{
497
497
zend_fiber * fiber = (zend_fiber * ) object ;
498
498
499
- if (fiber -> status != ZEND_FIBER_STATUS_SUSPENDED ) {
499
+ if (fiber -> context . status != ZEND_FIBER_STATUS_SUSPENDED ) {
500
500
return ;
501
501
}
502
502
503
503
zend_object * exception = EG (exception );
504
504
EG (exception ) = NULL ;
505
505
506
- fiber -> flags |= ZEND_FIBER_FLAG_DESTROYED ;
506
+ fiber -> context . flags |= ZEND_FIBER_FLAG_DESTROYED ;
507
507
508
508
zend_fiber_transfer transfer = zend_fiber_resume (fiber , NULL , false);
509
509
@@ -530,7 +530,7 @@ static void zend_fiber_object_free(zend_object *object)
530
530
{
531
531
zend_fiber * fiber = (zend_fiber * ) object ;
532
532
533
- if (fiber -> status == ZEND_FIBER_STATUS_INIT ) {
533
+ if (fiber -> context . status == ZEND_FIBER_STATUS_INIT ) {
534
534
// Fiber was never started, so we need to release the reference to the callback.
535
535
zval_ptr_dtor (& fiber -> fci .function_name );
536
536
}
@@ -568,7 +568,7 @@ ZEND_METHOD(Fiber, start)
568
568
RETURN_THROWS ();
569
569
}
570
570
571
- if (fiber -> status != ZEND_FIBER_STATUS_INIT ) {
571
+ if (fiber -> context . status != ZEND_FIBER_STATUS_INIT ) {
572
572
zend_throw_error (zend_ce_fiber_error , "Cannot start a fiber that has already been started" );
573
573
RETURN_THROWS ();
574
574
}
@@ -577,13 +577,11 @@ ZEND_METHOD(Fiber, start)
577
577
fiber -> fci .param_count = param_count ;
578
578
fiber -> fci .named_params = named_params ;
579
579
580
- zend_fiber_context * context = zend_fiber_get_context (fiber );
581
-
582
- if (!zend_fiber_init_context (context , zend_ce_fiber , zend_fiber_execute , EG (fiber_stack_size ))) {
580
+ if (!zend_fiber_init_context (& fiber -> context , zend_ce_fiber , zend_fiber_execute , EG (fiber_stack_size ))) {
583
581
RETURN_THROWS ();
584
582
}
585
583
586
- fiber -> previous = context ;
584
+ fiber -> previous = & fiber -> context ;
587
585
588
586
zend_fiber_transfer transfer = zend_fiber_resume (fiber , NULL , false);
589
587
@@ -606,7 +604,7 @@ ZEND_METHOD(Fiber, suspend)
606
604
RETURN_THROWS ();
607
605
}
608
606
609
- if (UNEXPECTED (fiber -> flags & ZEND_FIBER_FLAG_DESTROYED )) {
607
+ if (UNEXPECTED (fiber -> context . flags & ZEND_FIBER_FLAG_DESTROYED )) {
610
608
zend_throw_error (zend_ce_fiber_error , "Cannot suspend in a force-closed fiber" );
611
609
RETURN_THROWS ();
612
610
}
@@ -616,14 +614,14 @@ ZEND_METHOD(Fiber, suspend)
616
614
RETURN_THROWS ();
617
615
}
618
616
619
- ZEND_ASSERT (fiber -> status == ZEND_FIBER_STATUS_RUNNING || fiber -> status == ZEND_FIBER_STATUS_SUSPENDED );
617
+ ZEND_ASSERT (fiber -> context . status == ZEND_FIBER_STATUS_RUNNING || fiber -> context . status == ZEND_FIBER_STATUS_SUSPENDED );
620
618
621
619
fiber -> execute_data = EG (current_execute_data );
622
620
fiber -> stack_bottom -> prev_execute_data = NULL ;
623
621
624
622
zend_fiber_transfer transfer = zend_fiber_suspend (fiber , value );
625
623
626
- if (fiber -> flags & ZEND_FIBER_FLAG_DESTROYED ) {
624
+ if (fiber -> context . flags & ZEND_FIBER_FLAG_DESTROYED ) {
627
625
// This occurs when the fiber is GC'ed while suspended.
628
626
zval_ptr_dtor (& transfer .value );
629
627
zend_throw_graceful_exit ();
@@ -650,7 +648,7 @@ ZEND_METHOD(Fiber, resume)
650
648
651
649
fiber = (zend_fiber * ) Z_OBJ_P (getThis ());
652
650
653
- if (UNEXPECTED (fiber -> status != ZEND_FIBER_STATUS_SUSPENDED || fiber -> caller != NULL )) {
651
+ if (UNEXPECTED (fiber -> context . status != ZEND_FIBER_STATUS_SUSPENDED || fiber -> caller != NULL )) {
654
652
zend_throw_error (zend_ce_fiber_error , "Cannot resume a fiber that is not suspended" );
655
653
RETURN_THROWS ();
656
654
}
@@ -678,7 +676,7 @@ ZEND_METHOD(Fiber, throw)
678
676
679
677
fiber = (zend_fiber * ) Z_OBJ_P (getThis ());
680
678
681
- if (UNEXPECTED (fiber -> status != ZEND_FIBER_STATUS_SUSPENDED || fiber -> caller != NULL )) {
679
+ if (UNEXPECTED (fiber -> context . status != ZEND_FIBER_STATUS_SUSPENDED || fiber -> caller != NULL )) {
682
680
zend_throw_error (zend_ce_fiber_error , "Cannot resume a fiber that is not suspended" );
683
681
RETURN_THROWS ();
684
682
}
@@ -698,7 +696,7 @@ ZEND_METHOD(Fiber, isStarted)
698
696
699
697
fiber = (zend_fiber * ) Z_OBJ_P (getThis ());
700
698
701
- RETURN_BOOL (fiber -> status != ZEND_FIBER_STATUS_INIT );
699
+ RETURN_BOOL (fiber -> context . status != ZEND_FIBER_STATUS_INIT );
702
700
}
703
701
704
702
ZEND_METHOD (Fiber , isSuspended )
@@ -709,7 +707,7 @@ ZEND_METHOD(Fiber, isSuspended)
709
707
710
708
fiber = (zend_fiber * ) Z_OBJ_P (getThis ());
711
709
712
- RETURN_BOOL (fiber -> status == ZEND_FIBER_STATUS_SUSPENDED && fiber -> caller == NULL );
710
+ RETURN_BOOL (fiber -> context . status == ZEND_FIBER_STATUS_SUSPENDED && fiber -> caller == NULL );
713
711
}
714
712
715
713
ZEND_METHOD (Fiber , isRunning )
@@ -720,7 +718,7 @@ ZEND_METHOD(Fiber, isRunning)
720
718
721
719
fiber = (zend_fiber * ) Z_OBJ_P (getThis ());
722
720
723
- RETURN_BOOL (fiber -> status == ZEND_FIBER_STATUS_RUNNING || fiber -> caller != NULL );
721
+ RETURN_BOOL (fiber -> context . status == ZEND_FIBER_STATUS_RUNNING || fiber -> caller != NULL );
724
722
}
725
723
726
724
ZEND_METHOD (Fiber , isTerminated )
@@ -731,7 +729,7 @@ ZEND_METHOD(Fiber, isTerminated)
731
729
732
730
fiber = (zend_fiber * ) Z_OBJ_P (getThis ());
733
731
734
- RETURN_BOOL (fiber -> status == ZEND_FIBER_STATUS_DEAD );
732
+ RETURN_BOOL (fiber -> context . status == ZEND_FIBER_STATUS_DEAD );
735
733
}
736
734
737
735
ZEND_METHOD (Fiber , getReturn )
@@ -743,15 +741,15 @@ ZEND_METHOD(Fiber, getReturn)
743
741
744
742
fiber = (zend_fiber * ) Z_OBJ_P (getThis ());
745
743
746
- if (fiber -> status == ZEND_FIBER_STATUS_DEAD ) {
747
- if (fiber -> flags & ZEND_FIBER_FLAG_THREW ) {
744
+ if (fiber -> context . status == ZEND_FIBER_STATUS_DEAD ) {
745
+ if (fiber -> context . flags & ZEND_FIBER_FLAG_THREW ) {
748
746
message = "The fiber threw an exception" ;
749
- } else if (fiber -> flags & ZEND_FIBER_FLAG_BAILOUT ) {
747
+ } else if (fiber -> context . flags & ZEND_FIBER_FLAG_BAILOUT ) {
750
748
message = "The fiber exited with a fatal error" ;
751
749
} else {
752
750
RETURN_COPY (& fiber -> result );
753
751
}
754
- } else if (fiber -> status == ZEND_FIBER_STATUS_INIT ) {
752
+ } else if (fiber -> context . status == ZEND_FIBER_STATUS_INIT ) {
755
753
message = "The fiber has not been started" ;
756
754
} else {
757
755
message = "The fiber has not returned" ;
0 commit comments