Skip to content

Commit 42dbd1f

Browse files
committed
Improve Fiber::getReturn()
Allows flags besides ZEND_FIBER_FLAG_THREW to be set without causing this method to throw. The method will not be called after a bailout, so the ZEND_FIBER_FLAG_BAILOUT case was removed.
1 parent a65989b commit 42dbd1f

File tree

1 file changed

+10
-13
lines changed

1 file changed

+10
-13
lines changed

Zend/zend_fibers.c

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -664,29 +664,26 @@ ZEND_METHOD(Fiber, isTerminated)
664664
ZEND_METHOD(Fiber, getReturn)
665665
{
666666
zend_fiber *fiber;
667+
const char *message;
667668

668669
ZEND_PARSE_PARAMETERS_NONE();
669670

670671
fiber = (zend_fiber *) Z_OBJ_P(getThis());
671672

672-
if (fiber->status != ZEND_FIBER_STATUS_DEAD || fiber->flags) {
673-
const char *message;
674-
675-
if (fiber->status == ZEND_FIBER_STATUS_INIT) {
676-
message = "The fiber has not been started";
677-
} else if (fiber->flags & ZEND_FIBER_FLAG_THREW) {
673+
if (fiber->status == ZEND_FIBER_STATUS_DEAD) {
674+
if (fiber->flags & ZEND_FIBER_FLAG_THREW) {
678675
message = "The fiber threw an exception";
679-
} else if (fiber->flags & ZEND_FIBER_FLAG_BAILOUT) {
680-
message = "The fiber exited with a fatal error";
681676
} else {
682-
message = "The fiber has not returned";
677+
RETURN_COPY(&fiber->value);
683678
}
684-
685-
zend_throw_error(zend_ce_fiber_error, "Cannot get fiber return value: %s", message);
686-
RETURN_THROWS();
679+
} else if (fiber->status == ZEND_FIBER_STATUS_INIT) {
680+
message = "The fiber has not been started";
681+
} else {
682+
message = "The fiber has not returned";
687683
}
688684

689-
RETURN_COPY(&fiber->value);
685+
zend_throw_error(zend_ce_fiber_error, "Cannot get fiber return value: %s", message);
686+
RETURN_THROWS();
690687
}
691688

692689
ZEND_METHOD(Fiber, this)

0 commit comments

Comments
 (0)