Category
language
Problem
Generator::getReturn() is not implemented on the VM Generator builtin class. PHP 7.0+ allows return $value inside a generator; after the generator finishes, getReturn() yields that value (or throws if the generator was not closed).
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && php bin/vm.php -r "
function gen(): Generator { return 99; yield 1; }
\$g = gen(); \$g->next(); echo \$g->getReturn();
"'
# Fatal: Method call on non-object (Generator has no getReturn method)
php-src reference
Zend/zend_generators.c — zim_Generator_getReturn, generator return-value slot
ext/spl/spl_iterators.c — iterator glue (related)
Repro
<?php
function gen(): Generator {
yield 1;
return 99;
}
$g = gen();
$g->next();
echo $g->current(), "\n";
$g->next();
echo $g->getReturn(), "\n";
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && php bin/vm.php repro.php'
php repro.php
Zend PHP: prints 1 then 99.
This compiler: getReturn missing / generator return slot not stored.
Scope (this repo)
| Area |
Path |
Notes |
| VM |
lib/VM/GeneratorState.php |
Store return value on TYPE_GENERATOR_RETURN / final suspend |
| VM |
lib/VM.php |
Opcode lowering for return inside generator body |
| Builtin class |
GeneratorState::register |
Expose getReturn() method |
| Compiler |
lib/Compiler.php |
Ensure generator bodies allow return $expr |
| Tests |
test/compliance/cases/language/generator_get_return*.phpt |
VM + JIT when generators JIT lands (#167) |
Done when
Verification
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && vendor/bin/phpunit --filter generator_get_return'
./script/ci-fast.sh --filter generator_get_return
Links
Category
languageProblem
Generator::getReturn()is not implemented on the VMGeneratorbuiltin class. PHP 7.0+ allowsreturn $valueinside a generator; after the generator finishes,getReturn()yields that value (or throws if the generator was not closed).php-src reference
Zend/zend_generators.c—zim_Generator_getReturn, generator return-value slotext/spl/spl_iterators.c— iterator glue (related)Repro
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && php bin/vm.php repro.php' php repro.phpZend PHP: prints
1then99.This compiler:
getReturnmissing / generator return slot not stored.Scope (this repo)
lib/VM/GeneratorState.phpTYPE_GENERATOR_RETURN/ final suspendlib/VM.phpreturninside generator bodyGeneratorState::registergetReturn()methodlib/Compiler.phpreturn $exprtest/compliance/cases/language/generator_get_return*.phptDone when
returninside generator stores value accessible viagetReturn()getReturn()before close throwsExceptionmatching ZendVerification
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && vendor/bin/phpunit --filter generator_get_return' ./script/ci-fast.sh --filter generator_get_returnLinks