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