mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
* Make `ReflectionGenerator::getFunction()` legal after generator termination * Expose the generator function name via `Generator::__debugInfo()` * Allow creating `ReflectionGenerator` after termination * Reorder `struct _zend_generator` to avoid a hole * Adjust `ext/reflection/tests/028.phpt` This is legal now. * Fix Generator Closure collection * Add test to verify the Closure dies with the generator * NEWS / UPGRADING
56 lines
849 B
PHP
56 lines
849 B
PHP
--TEST--
|
|
Verify yield from on generators being properly cycle collected
|
|
--INI--
|
|
zend.enable_gc = 1
|
|
--FILE--
|
|
<?php
|
|
|
|
function root() {
|
|
global $gens; // create cyclic reference to root
|
|
try {
|
|
yield 1;
|
|
} finally {
|
|
var_dump($gens);
|
|
}
|
|
}
|
|
|
|
function gen($x) {
|
|
global $gens;
|
|
yield from $gens[] = $x ? gen(--$x) : root();
|
|
}
|
|
|
|
$gen = $gens[] = gen(2);
|
|
var_dump($gen->current());
|
|
unset($gen, $gens);
|
|
print "collect\n";
|
|
gc_collect_cycles();
|
|
print "end\n";
|
|
|
|
?>
|
|
--EXPECTF--
|
|
int(1)
|
|
collect
|
|
array(4) {
|
|
[0]=>
|
|
object(Generator)#%d (1) {
|
|
["function"]=>
|
|
string(3) "gen"
|
|
}
|
|
[1]=>
|
|
object(Generator)#%d (1) {
|
|
["function"]=>
|
|
string(3) "gen"
|
|
}
|
|
[2]=>
|
|
object(Generator)#%d (1) {
|
|
["function"]=>
|
|
string(3) "gen"
|
|
}
|
|
[3]=>
|
|
object(Generator)#%d (1) {
|
|
["function"]=>
|
|
string(4) "root"
|
|
}
|
|
}
|
|
end
|