Skip to content

Commit 1858014

Browse files
committed
Retain reference to callable while running
1 parent 2855910 commit 1858014

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
Reference to invocable class retained while running
3+
--FILE--
4+
<?php
5+
6+
class Test {
7+
public function __invoke() {
8+
$GLOBALS['test'] = null;
9+
var_dump($this);
10+
try {
11+
Fiber::suspend();
12+
} finally {
13+
var_dump($this);
14+
}
15+
}
16+
}
17+
18+
$test = new Test;
19+
$fiber = new Fiber($test);
20+
$fiber->start();
21+
22+
?>
23+
--EXPECT--
24+
object(Test)#1 (0) {
25+
}
26+
object(Test)#1 (0) {
27+
}

Zend/zend_fibers.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,8 @@ static void ZEND_STACK_ALIGNED zend_fiber_execute(zend_fiber_context *context)
349349

350350
zend_call_function(&fiber->fci, &fiber->fci_cache);
351351

352+
zval_ptr_dtor(&fiber->fci.function_name);
353+
352354
if (EG(exception)) {
353355
if (fiber->status == ZEND_FIBER_STATUS_SHUTDOWN) {
354356
if (EXPECTED(zend_is_graceful_exit(EG(exception)) || zend_is_unwind_exit(EG(exception)))) {
@@ -390,9 +392,13 @@ static void zend_fiber_object_destroy(zend_object *object)
390392
if (fiber->status == ZEND_FIBER_STATUS_SUSPENDED) {
391393
zend_object *exception = EG(exception);
392394
EG(exception) = NULL;
395+
393396
fiber->status = ZEND_FIBER_STATUS_SHUTDOWN;
397+
// Additional reference needed while running, removed in zend_fiber_execute.
394398
GC_ADDREF(&fiber->std);
399+
395400
zend_fiber_switch_to(fiber);
401+
396402
EG(exception) = exception;
397403
}
398404
}
@@ -452,8 +458,6 @@ ZEND_METHOD(Fiber, start)
452458

453459
zend_fiber_switch_to(fiber);
454460

455-
zval_ptr_dtor(&fiber->fci.function_name);
456-
457461
if (fiber->status & ZEND_FIBER_STATUS_FINISHED) {
458462
RETURN_NULL();
459463
}

0 commit comments

Comments
 (0)