@@ -240,18 +240,11 @@ ZEND_API zend_fiber_context *zend_fiber_switch_context(zend_fiber_context *to)
240
240
zend_fiber_capture_vm_state (& state );
241
241
242
242
to -> status = ZEND_FIBER_STATUS_RUNNING ;
243
- if (to -> caller == NULL ) {
244
- to -> caller = from ;
245
- }
246
243
247
244
if (from -> status == ZEND_FIBER_STATUS_RUNNING ) {
248
245
from -> status = ZEND_FIBER_STATUS_SUSPENDED ;
249
246
}
250
247
251
- if (from -> caller == to ) {
252
- from -> caller = NULL ;
253
- }
254
-
255
248
EG (current_fiber ) = to ;
256
249
257
250
#ifdef __SANITIZE_ADDRESS__
@@ -353,7 +346,10 @@ static ZEND_STACK_ALIGNED zend_fiber_context *zend_fiber_execute(zend_fiber_cont
353
346
fiber -> execute_data = NULL ;
354
347
fiber -> stack_bottom = NULL ;
355
348
356
- return fiber -> caller ;
349
+ zend_fiber_context * caller = fiber -> caller ;
350
+ fiber -> caller = NULL ;
351
+
352
+ return caller ;
357
353
}
358
354
359
355
static zend_object * zend_fiber_object_create (zend_class_entry * ce )
@@ -380,6 +376,7 @@ static void zend_fiber_object_destroy(zend_object *object)
380
376
zend_object * exception = EG (exception );
381
377
EG (exception ) = NULL ;
382
378
379
+ fiber -> caller = EG (current_fiber );
383
380
fiber -> flags |= ZEND_FIBER_FLAG_DESTROYED ;
384
381
385
382
zend_fiber_switch_context (zend_fiber_get_context (fiber ));
@@ -452,6 +449,8 @@ ZEND_METHOD(Fiber, start)
452
449
RETURN_THROWS ();
453
450
}
454
451
452
+ fiber -> caller = EG (current_fiber );
453
+
455
454
zend_fiber_switch_context (context );
456
455
457
456
if (fiber -> status == ZEND_FIBER_STATUS_DEAD ) {
@@ -477,24 +476,27 @@ ZEND_METHOD(Fiber, suspend)
477
476
}
478
477
479
478
zend_fiber * fiber = zend_fiber_from_context (EG (current_fiber ));
479
+ zend_fiber_context * caller = fiber -> caller ;
480
480
481
481
if (UNEXPECTED (fiber -> flags & ZEND_FIBER_FLAG_DESTROYED )) {
482
482
zend_throw_error (zend_ce_fiber_error , "Cannot suspend in a force-closed fiber" );
483
483
RETURN_THROWS ();
484
484
}
485
485
486
486
ZEND_ASSERT (fiber -> status == ZEND_FIBER_STATUS_RUNNING );
487
+ ZEND_ASSERT (caller != NULL );
487
488
488
489
if (value ) {
489
490
ZVAL_COPY (& fiber -> value , value );
490
491
} else {
491
492
ZVAL_NULL (& fiber -> value );
492
493
}
493
494
495
+ fiber -> caller = NULL ;
494
496
fiber -> execute_data = EG (current_execute_data );
495
497
fiber -> stack_bottom -> prev_execute_data = NULL ;
496
498
497
- zend_fiber_switch_context (fiber -> caller );
499
+ zend_fiber_switch_context (caller );
498
500
499
501
if (fiber -> flags & ZEND_FIBER_FLAG_DESTROYED ) {
500
502
// This occurs when the fiber is GC'ed while suspended.
@@ -537,6 +539,7 @@ ZEND_METHOD(Fiber, resume)
537
539
ZVAL_NULL (& fiber -> value );
538
540
}
539
541
542
+ fiber -> caller = EG (current_fiber );
540
543
fiber -> stack_bottom -> prev_execute_data = EG (current_execute_data );
541
544
542
545
zend_fiber_switch_context (zend_fiber_get_context (fiber ));
@@ -568,6 +571,7 @@ ZEND_METHOD(Fiber, throw)
568
571
Z_ADDREF_P (exception );
569
572
fiber -> exception = exception ;
570
573
574
+ fiber -> caller = EG (current_fiber );
571
575
fiber -> stack_bottom -> prev_execute_data = EG (current_execute_data );
572
576
573
577
zend_fiber_switch_context (zend_fiber_get_context (fiber ));
@@ -693,7 +697,6 @@ void zend_fiber_init(void)
693
697
zend_fiber_context * context = ecalloc (1 , sizeof (zend_fiber_context ));
694
698
695
699
context -> status = ZEND_FIBER_STATUS_RUNNING ;
696
- context -> caller = (zend_fiber_context * ) -1 ;
697
700
698
701
EG (main_fiber ) = context ;
699
702
EG (current_fiber ) = context ;
0 commit comments