Skip to content

Commit c2b33d8

Browse files
committed
Separate dtor and free
1 parent 7e7927c commit c2b33d8

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

Zend/zend_fibers.c

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -389,28 +389,32 @@ static void zend_fiber_object_destroy(zend_object *object)
389389
{
390390
zend_fiber *fiber = (zend_fiber *) object;
391391

392-
if (UNEXPECTED(fiber->status == ZEND_FIBER_STATUS_INIT)) {
392+
if (fiber->status == ZEND_FIBER_STATUS_SUSPENDED) {
393+
zend_object *exception = EG(exception);
394+
EG(exception) = NULL;
395+
fiber->status = ZEND_FIBER_STATUS_SHUTDOWN;
396+
GC_ADDREF(&fiber->std);
397+
zend_fiber_switch_to(fiber);
398+
EG(exception) = exception;
399+
}
400+
}
401+
402+
static void zend_fiber_object_free(zend_object *object)
403+
{
404+
zend_fiber *fiber = (zend_fiber *) object;
405+
406+
if (fiber->status == ZEND_FIBER_STATUS_INIT) {
393407
// Fiber was never started, so we need to release the reference to the callback.
394408
zval_ptr_dtor(&fiber->fci.function_name);
395-
} else {
396-
if (fiber->status == ZEND_FIBER_STATUS_SUSPENDED) {
397-
zend_object *exception = EG(exception);
398-
EG(exception) = NULL;
399-
fiber->status = ZEND_FIBER_STATUS_SHUTDOWN;
400-
GC_ADDREF(&fiber->std);
401-
zend_fiber_switch_to(fiber);
402-
EG(exception) = exception;
403-
}
404-
405-
zval_ptr_dtor(&fiber->value);
406409
}
407410

411+
zval_ptr_dtor(&fiber->value);
412+
408413
zend_hash_index_del(&EG(fibers), (uintptr_t) fiber);
409414

410415
zend_fiber_destroy_context(&fiber->context);
411416

412417
zend_object_std_dtor(&fiber->std);
413-
414418
}
415419

416420
ZEND_METHOD(Fiber, __construct)
@@ -694,6 +698,7 @@ void zend_register_fiber_ce(void)
694698

695699
zend_fiber_handlers = std_object_handlers;
696700
zend_fiber_handlers.dtor_obj = zend_fiber_object_destroy;
701+
zend_fiber_handlers.free_obj = zend_fiber_object_free;
697702
zend_fiber_handlers.clone_obj = NULL;
698703

699704
zend_ce_fiber_error = register_class_FiberError(zend_ce_error);

0 commit comments

Comments
 (0)