These opcodes hardly ever would throw exceptions their selves.

This real problem should be fixed in HANDLE_EXCEPTION handler.
There we will need to get the list of "active" temporary variables.
I don't have a good solution for this yet.

Thanks. Dmitry.

On Tue, Mar 24, 2015 at 10:45 PM, Nikita Popov <nikita....@gmail.com> wrote:

> On Tue, Mar 24, 2015 at 1:08 PM, Dmitry Stogov <dmi...@zend.com> wrote:
>
>>
>>
>> On Tue, Mar 24, 2015 at 2:51 PM, Nikita Popov <nikita....@gmail.com>
>> wrote:
>>
>>> On Tue, Mar 24, 2015 at 10:28 AM, Dmitry Stogov <dmi...@zend.com> wrote:
>>>
>>>> I thought about something like this :)
>>>> In my opinion UString is really not a proper way to implement Unicoide,
>>>> but I agree not break anything in current stage.
>>>> Anyway, please review the first PR (in my opinion it is safe to
>>>> commit), but you may find some other issues.
>>>>
>>>> Thanks. Dmitry.
>>>>
>>>
>>> First PR looks okay to me. One question: Why the separate INIT and ADD
>>> opcodes? They seem pretty much the same, just one using a hardcoded 0
>>> instead of ex_val.
>>>
>>
>> Oh. It's historical, at first we allocated rope on heap. I'll check if
>> INIT_ROPE is still necessary.
>> Most probably we still need it, to know the size of rope vector.
>>
>>
>>> Regarding exception-safety - is the problem that doing an EG(exception)
>>> check and releasing the rope is too expensive?
>>>
>>
>> No. It's a common problem. Because exception may be thrown in some other
>> opcode and we don't clean IS_VAR/IS_TMP_VAR zvals.
>> For example the following script leaks independently from the patch
>>
>> <?php
>> function foo() {
>>   throw new Exception();
>> }
>> try {
>>         $a = "a";
>>         $a = $a . $a . $a . foo() . $a . "\n";
>> } catch (Exception $e) {
>> }
>> ?>
>>
>
> Ah yes, I forgot about this issue. However, shouldn't we at least properly
> release memory if the exception occurs in the opcode?
>
> Nikita
>

Reply via email to