@@ -360,6 +360,10 @@ ZEND_API void zend_fiber_destroy_context(zend_fiber_context *context)
360
360
{
361
361
zend_observer_fiber_destroy_notify (context );
362
362
363
+ if (context -> cleanup ) {
364
+ context -> cleanup (context );
365
+ }
366
+
363
367
zend_fiber_stack_free (context -> stack );
364
368
}
365
369
@@ -441,6 +445,19 @@ ZEND_API void zend_fiber_switch_context(zend_fiber_transfer *transfer)
441
445
}
442
446
}
443
447
448
+ static void zend_fiber_cleanup (zend_fiber_context * context )
449
+ {
450
+ zend_fiber * fiber = zend_fiber_from_context (context );
451
+
452
+ zend_vm_stack current_stack = EG (vm_stack );
453
+ EG (vm_stack ) = fiber -> vm_stack ;
454
+ zend_vm_stack_destroy ();
455
+ EG (vm_stack ) = current_stack ;
456
+ fiber -> execute_data = NULL ;
457
+ fiber -> stack_bottom = NULL ;
458
+ fiber -> caller = NULL ;
459
+ }
460
+
444
461
static ZEND_STACK_ALIGNED void zend_fiber_execute (zend_fiber_transfer * transfer )
445
462
{
446
463
ZEND_ASSERT (Z_TYPE (transfer -> value ) == IS_NULL && "Initial transfer value to fiber context must be NULL" );
@@ -501,12 +518,10 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer)
501
518
transfer -> flags = ZEND_FIBER_TRANSFER_FLAG_BAILOUT ;
502
519
} zend_end_try ();
503
520
504
- transfer -> context = fiber -> caller ;
521
+ fiber -> context .cleanup = & zend_fiber_cleanup ;
522
+ fiber -> vm_stack = EG (vm_stack );
505
523
506
- zend_vm_stack_destroy ();
507
- fiber -> execute_data = NULL ;
508
- fiber -> stack_bottom = NULL ;
509
- fiber -> caller = NULL ;
524
+ transfer -> context = fiber -> caller ;
510
525
}
511
526
512
527
/* Handles forwarding of result / error from a transfer into the running fiber. */
0 commit comments