Re: Safe Temporary Cleanup on Exception (Variable Liveness)
| From: | Dmitry Stogov | Date: | Wed, 11 Nov 2015 13:19:25 +0000 |
| Subject: | Re: Safe Temporary Cleanup on Exception (Variable Liveness) | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-89176@lists.php.net to get a copy of this message | ||
<https://gist.github.com/dstogov/43eaa3f3b68583877322>It
looks like the
last version of the patch https://github.com/php/php-src/pull/1634 solves
all the problems (except for reported by Nikita "unknown liveness in
finally" - Zend/tests/temporary_cleaning_010.phpt).
Please, analyse the patch and try to craft a script not covered by the
patch.
If nobody object and no problems found, I'll commit this on Friday.
Thanks. Dmitry.
On Tue, Nov 10, 2015 at 10:28 PM, Dmitry Stogov <dmitry@zend.com> wrote:
> 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 <dmitry@zend.com> wrote:
>
>>
>>
>> On Tue, Nov 10, 2015 at 1:42 PM, Nikita Popov <nikita.ppv@gmail.com>
>> wrote:
>>
>>> On Tue, Nov 10, 2015 at 10:53 AM, Dmitry Stogov <dmitry@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
>>>
>>>
>>
>