I've committed unrelated and obvious parts (without semantic changes). The updated and extended patch now is much more clean https://gist.github.com/dstogov/43eaa3f3b68583877322 Anyway, it's still incomplete.
Thanks. Dmitry. On Tue, Nov 10, 2015 at 2:29 PM, Dmitry Stogov <dmi...@zend.com> wrote: > > > On Tue, Nov 10, 2015 at 1:42 PM, Nikita Popov <nikita....@gmail.com> > wrote: > >> On Tue, Nov 10, 2015 at 10:53 AM, Dmitry Stogov <dmi...@zend.com> wrote: >> >>> Hi, >>> >>> Please take a look into >>> https://gist.github.com/dstogov/43eaa3f3b68583877322 >>> >>> This is variation on Bob's idea about variable liveness. >>> The patch is incomplete. Liveness construction is still naive. However, >>> all tests are passed. >>> >>> Ranges are represented by start/end/variable cartages. (I suppose this >>> representation is more compact, than in the original proposal). >>> In general, it's possible to use few ranges for the same variable, if >>> its whole live range is not linear. (this is not implemented yet). >>> >>> Related ideas and tests are welcome. >>> >>> Thanks. Dmitry. >>> >> >> One leak this does not cover yet is a discarded delayed return value: >> >> function test() { >> try { >> $a = [1, 2, 3]; >> return $a + []; >> } finally { >> throw new Exception; >> } >> } >> >> try { >> test(); >> } catch (Exception $e) {} >> >> This case is a bit tricky because it violates the usual invariant that >> all temporaries have well-defined liveness ranges (either alive or not, no >> maybe). We'd have to change that first. >> > > I see the problem. We can't statically define live-ranges for finally > code, because we don't know where it's going to be called from. > May be we may reconstruct this at run-time. > > Thanks. Dmitry, > > > >> >> Nikita >> >> >