On Tue, 20 Oct 2015, Bob Weinand wrote:

> > Am 20.10.2015 um 18:08 schrieb Derick Rethans <der...@php.net>:
> > 
> > On Tue, 20 Oct 2015, Bob Weinand wrote:
> > 
> >>> Am 20.10.2015 um 17:11 schrieb Xinchen Hui <larue...@php.net>:
> >>> 
> >>> On Tue, Oct 20, 2015 at 10:45 PM, Derick Rethans <der...@php.net 
> >>> <mailto:der...@php.net>> 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.
> 
> 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?

I don't know. Dmitry, Xinchen? I'd like to get this resolved soon..

cheers,
Derick
-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to