@@ -388,10 +388,6 @@ ZEND_API void zend_fiber_switch_context(zend_fiber_transfer *transfer)
388
388
389
389
zend_observer_fiber_switch_notify (from , to );
390
390
391
- if (from -> kind == zend_ce_fiber ) {
392
- zend_fiber_from_context (from )-> execute_data = EG (current_execute_data );
393
- }
394
-
395
391
zend_fiber_capture_vm_state (& state );
396
392
397
393
to -> status = ZEND_FIBER_STATUS_RUNNING ;
@@ -530,7 +526,7 @@ static zend_always_inline void zend_fiber_delegate_transfer_result(
530
526
}
531
527
532
528
static zend_always_inline zend_fiber_transfer zend_fiber_switch_to (
533
- zend_fiber_context * context , zval * value , bool exception
529
+ zend_fiber * from , zend_fiber_context * context , zval * value , bool exception
534
530
) {
535
531
zend_fiber_transfer transfer = {
536
532
.context = context ,
@@ -543,6 +539,11 @@ static zend_always_inline zend_fiber_transfer zend_fiber_switch_to(
543
539
ZVAL_NULL (& transfer .value );
544
540
}
545
541
542
+ if (from ) {
543
+ from -> execute_data = EG (current_execute_data );
544
+ from -> stack_bottom -> prev_execute_data = NULL ;
545
+ }
546
+
546
547
zend_fiber_switch_context (& transfer );
547
548
548
549
/* Forward bailout into current fiber. */
@@ -561,7 +562,7 @@ static zend_always_inline zend_fiber_transfer zend_fiber_resume(zend_fiber *fibe
561
562
fiber -> caller = EG (current_fiber_context );
562
563
EG (active_fiber ) = fiber ;
563
564
564
- zend_fiber_transfer transfer = zend_fiber_switch_to (fiber -> previous , value , exception );
565
+ zend_fiber_transfer transfer = zend_fiber_switch_to (previous , fiber -> previous , value , exception );
565
566
566
567
EG (active_fiber ) = previous ;
567
568
@@ -576,7 +577,7 @@ static zend_always_inline zend_fiber_transfer zend_fiber_suspend(zend_fiber *fib
576
577
fiber -> previous = EG (current_fiber_context );
577
578
fiber -> caller = NULL ;
578
579
579
- return zend_fiber_switch_to (caller , value , false);
580
+ return zend_fiber_switch_to (fiber , caller , value , false);
580
581
}
581
582
582
583
static zend_object * zend_fiber_object_create (zend_class_entry * ce )
@@ -745,9 +746,6 @@ ZEND_METHOD(Fiber, suspend)
745
746
746
747
ZEND_ASSERT (fiber -> context .status == ZEND_FIBER_STATUS_RUNNING || fiber -> context .status == ZEND_FIBER_STATUS_SUSPENDED );
747
748
748
- fiber -> execute_data = EG (current_execute_data );
749
- fiber -> stack_bottom -> prev_execute_data = NULL ;
750
-
751
749
zend_fiber_transfer transfer = zend_fiber_suspend (fiber , value );
752
750
753
751
zend_fiber_delegate_transfer_result (& transfer , INTERNAL_FUNCTION_PARAM_PASSTHRU );
0 commit comments