HomePhabricator

Eliminate transform_yield_break()

Description

Eliminate transform_yield_break()

The only places where ReturnStatement is constructed are:

  • onReturn(check_yield=true) -> not allowed in generator
  • onReturn(check_yield=false) -> coming from transform_yield_break, right after creating hphp_continuation_done()
  • MethodStatement, end of function call -> hphp_continuation_done() is created at end of generator in prepare_generator()

Emitter is emitting ContExit in ReturnStatements used in generators. As
can be seen from the analysis above, it's always preceded by emitting
ContDone from hphp_continuation_done(). Let's emit ContDone inside the
ReturnStatement directly and kill usage of hphp_continuation_done().

transform_yield_break() becomes a simple onReturn(check_yield=false), so
let's inline it into onYield and create ReturnStatement directly. After
this change, check_yield flag is always true and can be killed.

ContExit was also used after emitting a generator method in case the end
of method is still reachable. ContDone is added so that the generator is
properly closed. I believe this is never actually used, as MethodStatement
creates ReturnStatement at the end of method anyway.

Details

Provenance
janAuthored on
Sara GolemonCommitted on Mar 25 2013, 6:31 PM
Parents
rOSHD5ce11ce94002: get static locals from the first local AFTER the params
Branches
Unknown
Tags
Unknown
ChangeId
None

Event Timeline