On Wed, Nov 11, 2015 at 11:10 AM, Xinchen Hui <xinche...@zend.com> wrote:
> Hey: > > On Tue, Nov 10, 2015 at 7: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. >> > Or maybe we could separate ZEND_RETURN(_BY_REF) into two parts > > the first part, set the return value to EX(return_value), the second part > do the really leave(leave_helper). > > thus, we can keep the liveness of the variable won't be intrruptted? > > like: previously we emit: ZEND_ADD, ZEND_FAST_CALL, ZEND_RETURN. > > now we emit: ZEND_ADD, ZEND_RETURN, ZEND_FAST_CALL, ZEND_RETURN > s #ZEND_RETURN$#ZEND_LEAVE# thanks > > then in HANDLE_EXCEPTION we can dtor EX(return_value) if it is > already set? > > this could also fixed double return memory leak > like Zend/tests/try/bug70228.phpt > > thanks > >> >> Thanks. Dmitry, >> >> >> >>> >>> Nikita >>> >>> >> > > > -- > Xinchen Hui > @Laruence > http://www.laruence.com/ > -- Xinchen Hui @Laruence http://www.laruence.com/