Skip to content

Commit 6cc5d31

Browse files
committed
Set execute_data on previous fiber in zend_fiber_switch_to
1 parent d4ff572 commit 6cc5d31

File tree

1 file changed

+8
-10
lines changed

1 file changed

+8
-10
lines changed

Zend/zend_fibers.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -388,10 +388,6 @@ ZEND_API void zend_fiber_switch_context(zend_fiber_transfer *transfer)
388388

389389
zend_observer_fiber_switch_notify(from, to);
390390

391-
if (from->kind == zend_ce_fiber) {
392-
zend_fiber_from_context(from)->execute_data = EG(current_execute_data);
393-
}
394-
395391
zend_fiber_capture_vm_state(&state);
396392

397393
to->status = ZEND_FIBER_STATUS_RUNNING;
@@ -530,7 +526,7 @@ static zend_always_inline void zend_fiber_delegate_transfer_result(
530526
}
531527

532528
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
534530
) {
535531
zend_fiber_transfer transfer = {
536532
.context = context,
@@ -543,6 +539,11 @@ static zend_always_inline zend_fiber_transfer zend_fiber_switch_to(
543539
ZVAL_NULL(&transfer.value);
544540
}
545541

542+
if (from) {
543+
from->execute_data = EG(current_execute_data);
544+
from->stack_bottom->prev_execute_data = NULL;
545+
}
546+
546547
zend_fiber_switch_context(&transfer);
547548

548549
/* Forward bailout into current fiber. */
@@ -561,7 +562,7 @@ static zend_always_inline zend_fiber_transfer zend_fiber_resume(zend_fiber *fibe
561562
fiber->caller = EG(current_fiber_context);
562563
EG(active_fiber) = fiber;
563564

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);
565566

566567
EG(active_fiber) = previous;
567568

@@ -576,7 +577,7 @@ static zend_always_inline zend_fiber_transfer zend_fiber_suspend(zend_fiber *fib
576577
fiber->previous = EG(current_fiber_context);
577578
fiber->caller = NULL;
578579

579-
return zend_fiber_switch_to(caller, value, false);
580+
return zend_fiber_switch_to(fiber, caller, value, false);
580581
}
581582

582583
static zend_object *zend_fiber_object_create(zend_class_entry *ce)
@@ -745,9 +746,6 @@ ZEND_METHOD(Fiber, suspend)
745746

746747
ZEND_ASSERT(fiber->context.status == ZEND_FIBER_STATUS_RUNNING || fiber->context.status == ZEND_FIBER_STATUS_SUSPENDED);
747748

748-
fiber->execute_data = EG(current_execute_data);
749-
fiber->stack_bottom->prev_execute_data = NULL;
750-
751749
zend_fiber_transfer transfer = zend_fiber_suspend(fiber, value);
752750

753751
zend_fiber_delegate_transfer_result(&transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);

0 commit comments

Comments
 (0)