Skip to content

Language: Generator::getReturn() — return value from generator (Zend zend_generators.c parity) #3350

Description

@PurHur

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.czim_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

  • return inside generator stores value accessible via getReturn()
  • Calling getReturn() before close throws Exception matching Zend
  • Compliance PHPT green on VM

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:compilerCompiler / CFG / JITarea:vmVirtual machineenhancementNew feature or requestimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimphase-2:languagePhase 2 – language features

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions