> Am 20.10.2015 um 18:08 schrieb Derick Rethans <[email protected]>:
>
> On Tue, 20 Oct 2015, Bob Weinand wrote:
>
>>> Am 20.10.2015 um 17:11 schrieb Xinchen Hui <[email protected]>:
>>>
>>> On Tue, Oct 20, 2015 at 10:45 PM, Derick Rethans <[email protected]
>>> <mailto:[email protected]>> wrote:
>>>
>>>> When hacking on Xdebug for PHP 7, I ran into some issues where PHP
>>>> would just spin around. This happens when there is an exception,
>>>> and I use overloaded opcodes. I wrote a small example extension at
>>>> https://github.com/derickr/php-minimal-opcode-overloading-example
>>>> with a test case (
>>>> https://github.com/derickr/php-minimal-opcode-overloading-example/blob/master/tests/test.php
>>>>
>>>> ) that shows that something is looping in executing opcodes, as the
>>>> HANDLE_EXCEPTION iirc doesn't advance to the next opline. I believe
>>>> this is a recent enough change, as it only started happening after
>>>> I upgraded from about RC1 to latest master.
>>>>
>>>> Would you care to have a look?
>>>>
>>> This is introduced by a fix made by Bob,
>>> https://github.com/php/php-src/commit/808f62bb
>>> <https://github.com/php/php-src/commit/808f62bb>
>>>
>>> Bob, I am going to revert this for now, since you didn't include a
>>> test script to show where the problem was, I am not sure why you
>>> made this?
>>
>> I didn't add any test case as we don't have any APIs in php-src using
>> that user_opcode handler. I discussed the change back then with Dmitry
>> and committed with his review.
>>
>> It concretely broke uopz which might throw an exception itself. And in
>> turn we realized that for integrity we need to ensure that opline ==
>> EX(opline) else we'll end up with different behavior in global
>> register builds and normal builds.
>>
>> In general, you should not overload ZEND_HANDLE_EXCEPTION (if you need
>> to, have a special handling for it, but never directly dispatch to
>> it). It is quite special being the only opcode actually allowing
>> EG(exception) to be non-NULL at the start of it.
>>
>> You are doing an #ifdef ZTS to exempt it… why don't you always exempt
>> it?
>
> Even if I do (like I've just pushed into the extension), the test still
> fails because the code loops. So you did break something.
>
> cheers,
> Derick
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
Ah, ZEND_CATCH indeed also allows EG(exception) to be non-null…
… maybe I should write
if (EG(exception)
&& opline->opcode != ZEND_HANDLE_EXCEPTION && opline->opcode != ZEND_CATCH
&& ret != ZEND_USER_OPCODE_DISPATCH && ret != ZEND_USER_OPCODE_RETURN && ret
!= ZEND_USER_OPCODE_ENTER && ret != ZEND_USER_OPCODE_LEAVE) {
HANDLE_EXCEPTION();
}
to allow dispatching for these two opcodes too?
Bob
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php