@@ -237,18 +237,11 @@ ZEND_API zend_fiber_context *zend_fiber_switch_context(zend_fiber_context *to)
237
237
zend_fiber_capture_vm_state (& state );
238
238
239
239
to -> status = ZEND_FIBER_STATUS_RUNNING ;
240
- if (to -> caller == NULL ) {
241
- to -> caller = from ;
242
- }
243
240
244
241
if (from -> status == ZEND_FIBER_STATUS_RUNNING ) {
245
242
from -> status = ZEND_FIBER_STATUS_SUSPENDED ;
246
243
}
247
244
248
- if (from -> caller == to ) {
249
- from -> caller = NULL ;
250
- }
251
-
252
245
EG (current_fiber ) = to ;
253
246
254
247
#ifdef __SANITIZE_ADDRESS__
@@ -350,7 +343,10 @@ static ZEND_STACK_ALIGNED zend_fiber_context *zend_fiber_execute(zend_fiber_cont
350
343
fiber -> execute_data = NULL ;
351
344
fiber -> stack_bottom = NULL ;
352
345
353
- return fiber -> caller ;
346
+ zend_fiber_context * caller = fiber -> caller ;
347
+ fiber -> caller = NULL ;
348
+
349
+ return caller ;
354
350
}
355
351
356
352
static zend_object * zend_fiber_object_create (zend_class_entry * ce )
@@ -377,6 +373,7 @@ static void zend_fiber_object_destroy(zend_object *object)
377
373
zend_object * exception = EG (exception );
378
374
EG (exception ) = NULL ;
379
375
376
+ fiber -> caller = EG (current_fiber );
380
377
fiber -> flags |= ZEND_FIBER_FLAG_DESTROYED ;
381
378
382
379
zend_fiber_switch_context (zend_fiber_get_context (fiber ));
@@ -449,6 +446,8 @@ ZEND_METHOD(Fiber, start)
449
446
RETURN_THROWS ();
450
447
}
451
448
449
+ fiber -> caller = EG (current_fiber );
450
+
452
451
zend_fiber_switch_context (context );
453
452
454
453
if (fiber -> status == ZEND_FIBER_STATUS_DEAD ) {
@@ -474,24 +473,27 @@ ZEND_METHOD(Fiber, suspend)
474
473
}
475
474
476
475
zend_fiber * fiber = zend_fiber_from_context (EG (current_fiber ));
476
+ zend_fiber_context * caller = fiber -> caller ;
477
477
478
478
if (UNEXPECTED (fiber -> flags & ZEND_FIBER_FLAG_DESTROYED )) {
479
479
zend_throw_error (zend_ce_fiber_error , "Cannot suspend in a force-closed fiber" );
480
480
RETURN_THROWS ();
481
481
}
482
482
483
483
ZEND_ASSERT (fiber -> status == ZEND_FIBER_STATUS_RUNNING );
484
+ ZEND_ASSERT (caller != NULL );
484
485
485
486
if (value ) {
486
487
ZVAL_COPY (& fiber -> value , value );
487
488
} else {
488
489
ZVAL_NULL (& fiber -> value );
489
490
}
490
491
492
+ fiber -> caller = NULL ;
491
493
fiber -> execute_data = EG (current_execute_data );
492
494
fiber -> stack_bottom -> prev_execute_data = NULL ;
493
495
494
- zend_fiber_switch_context (fiber -> caller );
496
+ zend_fiber_switch_context (caller );
495
497
496
498
if (fiber -> flags & ZEND_FIBER_FLAG_DESTROYED ) {
497
499
// This occurs when the fiber is GC'ed while suspended.
@@ -534,6 +536,7 @@ ZEND_METHOD(Fiber, resume)
534
536
ZVAL_NULL (& fiber -> value );
535
537
}
536
538
539
+ fiber -> caller = EG (current_fiber );
537
540
fiber -> stack_bottom -> prev_execute_data = EG (current_execute_data );
538
541
539
542
zend_fiber_switch_context (zend_fiber_get_context (fiber ));
@@ -565,6 +568,7 @@ ZEND_METHOD(Fiber, throw)
565
568
Z_ADDREF_P (exception );
566
569
fiber -> exception = exception ;
567
570
571
+ fiber -> caller = EG (current_fiber );
568
572
fiber -> stack_bottom -> prev_execute_data = EG (current_execute_data );
569
573
570
574
zend_fiber_switch_context (zend_fiber_get_context (fiber ));
@@ -690,7 +694,6 @@ void zend_fiber_init(void)
690
694
zend_fiber_context * context = ecalloc (1 , sizeof (zend_fiber_context ));
691
695
692
696
context -> status = ZEND_FIBER_STATUS_RUNNING ;
693
- context -> caller = (zend_fiber_context * ) -1 ;
694
697
695
698
EG (main_fiber ) = context ;
696
699
EG (current_fiber ) = context ;
0 commit comments