@@ -389,28 +389,32 @@ static void zend_fiber_object_destroy(zend_object *object)
389
389
{
390
390
zend_fiber * fiber = (zend_fiber * ) object ;
391
391
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 ) {
393
407
// Fiber was never started, so we need to release the reference to the callback.
394
408
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 );
406
409
}
407
410
411
+ zval_ptr_dtor (& fiber -> value );
412
+
408
413
zend_hash_index_del (& EG (fibers ), (uintptr_t ) fiber );
409
414
410
415
zend_fiber_destroy_context (& fiber -> context );
411
416
412
417
zend_object_std_dtor (& fiber -> std );
413
-
414
418
}
415
419
416
420
ZEND_METHOD (Fiber , __construct )
@@ -694,6 +698,7 @@ void zend_register_fiber_ce(void)
694
698
695
699
zend_fiber_handlers = std_object_handlers ;
696
700
zend_fiber_handlers .dtor_obj = zend_fiber_object_destroy ;
701
+ zend_fiber_handlers .free_obj = zend_fiber_object_free ;
697
702
zend_fiber_handlers .clone_obj = NULL ;
698
703
699
704
zend_ce_fiber_error = register_class_FiberError (zend_ce_error );
0 commit comments