Skip to content

Commit 15dcdd7

Browse files
committed
Remove copying of fiber result to transfer value
Removes unnecessary copying of fiber return value to transfer value. This zval was not used as the return of start/resume/throw, instead being destroyed when the fiber was dead. Now the zval initialized to NULL when starting the fiber is maintained as the transfer value and is subsequently returned from start/resume/throw.
1 parent f71d62e commit 15dcdd7

File tree

1 file changed

+8
-13
lines changed

1 file changed

+8
-13
lines changed

Zend/zend_fibers.c

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

389389
static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
390390
{
391+
ZEND_ASSERT(Z_TYPE(transfer->value) == IS_NULL && "Initial transfer value to fiber context must be NULL");
392+
ZEND_ASSERT(!transfer->flags && "No flags should be set on initial transfer");
393+
391394
zend_fiber *fiber = EG(active_fiber);
392395

393396
/* Determine the current error_reporting ini setting. */
@@ -398,7 +401,6 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
398401
}
399402

400403
EG(vm_stack) = NULL;
401-
transfer->flags = 0;
402404

403405
zend_first_try {
404406
zend_vm_stack stack = zend_vm_stack_new_page(ZEND_FIBER_VM_STACK_SIZE, NULL);
@@ -436,8 +438,6 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
436438
}
437439

438440
zend_clear_exception();
439-
} else {
440-
ZVAL_COPY(&transfer->value, &fiber->result);
441441
}
442442
} zend_catch {
443443
fiber->flags |= ZEND_FIBER_FLAG_BAILOUT;
@@ -454,19 +454,14 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
454454

455455
/* Handles forwarding of result / error from a transfer into the running fiber. */
456456
static zend_always_inline void zend_fiber_delegate_transfer_result(
457-
zend_fiber *fiber, zend_fiber_transfer *transfer, INTERNAL_FUNCTION_PARAMETERS
457+
zend_fiber_transfer *transfer, INTERNAL_FUNCTION_PARAMETERS
458458
) {
459459
if (transfer->flags & ZEND_FIBER_TRANSFER_FLAG_ERROR) {
460460
/* Use internal throw to skip the Throwable-check that would fail for (graceful) exit. */
461461
zend_throw_exception_internal(Z_OBJ(transfer->value));
462462
RETURN_THROWS();
463463
}
464464

465-
if (fiber->context.status == ZEND_FIBER_STATUS_DEAD) {
466-
zval_ptr_dtor(&transfer->value);
467-
RETURN_NULL();
468-
}
469-
470465
RETURN_COPY_VALUE(&transfer->value);
471466
}
472467

@@ -625,7 +620,7 @@ ZEND_METHOD(Fiber, start)
625620

626621
zend_fiber_transfer transfer = zend_fiber_resume(fiber, NULL, false);
627622

628-
zend_fiber_delegate_transfer_result(fiber, &transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
623+
zend_fiber_delegate_transfer_result(&transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
629624
}
630625

631626
ZEND_METHOD(Fiber, suspend)
@@ -668,7 +663,7 @@ ZEND_METHOD(Fiber, suspend)
668663
RETURN_THROWS();
669664
}
670665

671-
zend_fiber_delegate_transfer_result(fiber, &transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
666+
zend_fiber_delegate_transfer_result(&transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
672667
}
673668

674669
ZEND_METHOD(Fiber, resume)
@@ -697,7 +692,7 @@ ZEND_METHOD(Fiber, resume)
697692

698693
zend_fiber_transfer transfer = zend_fiber_resume(fiber, value, false);
699694

700-
zend_fiber_delegate_transfer_result(fiber, &transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
695+
zend_fiber_delegate_transfer_result(&transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
701696
}
702697

703698
ZEND_METHOD(Fiber, throw)
@@ -725,7 +720,7 @@ ZEND_METHOD(Fiber, throw)
725720

726721
zend_fiber_transfer transfer = zend_fiber_resume(fiber, exception, true);
727722

728-
zend_fiber_delegate_transfer_result(fiber, &transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
723+
zend_fiber_delegate_transfer_result(&transfer, INTERNAL_FUNCTION_PARAM_PASSTHRU);
729724
}
730725

731726
ZEND_METHOD(Fiber, isStarted)

0 commit comments

Comments
 (0)