Hey:
On Wed, Oct 21, 2015 at 10:38 PM, Derick Rethans <der...@php.net> wrote: > 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.. > > The commit which cause this problem has been reverted, so this is resolved , and regarding the problem which is commit tried to fixed, we will find a better way to re-fix that. thanks > cheers, > Derick -- Xinchen Hui @Laruence http://www.laruence.com/