On Sat, Apr 15, 2017 at 1:13 PM, Derick Rethans <der...@php.net> wrote:

> On April 15, 2017 5:24:53 PM GMT+01:00, Nikita Popov <nikita....@gmail.com>
> wrote:
> >On Sat, Apr 15, 2017 at 5:25 PM, Derick Rethans <der...@php.net> wrote:
> >
> >> Hi Nikita,
> >>
> >> Through Xdebug bug #1413 (https://bugs.xdebug.org/view.php?id=1413),
> >I
> >> noticed
> >> that behaviour with class constants changed between PHP 7.1.3 and PHP
> >> 7.1.4.
> >> I *believe* it is because of the fix for issue #69676
> >> (https://bugs.php.net/bug.php?id=69676) that got fixed in PHP 7.1.4.
> >>
> >> With OPcache loaded, the INIT_ARRAY and further opcodes are relisted
> >as
> >> being
> >> on line 15 instead of line 17. Although, I would probably argue that
> >> INIT_ARRAY should really be on line 13 (the opening [).
> >>
> >> Without OPcache loaded, in PHP 7.1.3, FETCH_CLASS_CONSTANT is on line
> >15,
> >> and
> >> the INIT_ARRAY and further opcodes are on line 17. In PHP 7.1.4, they
> >are
> >> all
> >> on line 15 - with 17 no longer showing up.
> >>
> >> I believe, the behaviour with and without OPcache should be the same,
> >and I
> >> would argue that the correct result would need to be that
> >> FETCH_CLASS_CONSTANT
> >> (if still present, OPcache optimises it out) should be on line 15,
> >the
> >> INIT_ARRAY on line 13, and the SEND_VAL_EX and further, are on line
> >17.
> >>
> >> Code
> >> ====
> >>
> >>   1 <?php
> >>   2
> >>   3 namespace ICanBoogie\Validate\Validator;
> >>   4
> >>   5 class Required2
> >>   6 {
> >>   7     const ALIAS = 'required';
> >>   8     const DEFAULT_MESSAGE = "is required";
> >>   9     const OPTION_STOP_ON_ERROR = 'stop_on_error';
> >>  10
> >>  11     public function normalize_params(array $params)
> >>  12     {
> >>  13         return array_merge([
> >>  14
> >>  15             self::OPTION_STOP_ON_ERROR => true
> >>  16
> >>  17         ], $params);
> >>  18     }
> >>  19 }
> >>
> >>
> >> PHP 7.1.3 (no OPcache)
> >> ======================
> >>
> >> filename:       /tmp/xdebug-bug-1/lib/Required2.php
> >> function name:  normalize_params
> >> number of ops:  14
> >> compiled vars:  !0 = $params
> >> line     #* E I O op                           fetch          ext
> >return
> >> operands
> >> ------------------------------------------------------------
> >> -------------------------
> >>   11     0  E >   EXT_NOP
> >>          1        RECV                                             !0
> >>   13     2        EXT_STMT
> >>          3        INIT_NS_FCALL_BY_NAME
> >>          4        EXT_FCALL_BEGIN
> >>   15     5        FETCH_CLASS_CONSTANT                             ~1
> >> 'OPTION_STOP_ON_ERROR'
> >>   17     6        INIT_ARRAY                                       ~2
> >> <true>, ~1
> >>          7        SEND_VAL_EX
> >> ~2
> >>          8        SEND_VAR_EX
> >> !0
> >>          9        DO_FCALL_BY_NAME
> >>         10        EXT_FCALL_END
> >>         11      > RETURN
> >>  $3
> >>   18    12*       EXT_STMT
> >>         13*     > RETURN
> >>  null
> >>
> >>
> >> PHP 7.1.3 (OPcache)
> >> ======================
> >>
> >> filename:       /tmp/xdebug-bug-1/lib/Required2.php
> >> function name:  normalize_params
> >> number of ops:  11
> >> compiled vars:  !0 = $params
> >> line     #* E I O op                           fetch          ext
> >return
> >> operands
> >> ------------------------------------------------------------
> >> -------------------------
> >>   11     0  E >   EXT_NOP
> >>          1        RECV                                             !0
> >>   13     2        EXT_STMT
> >>          3        INIT_NS_FCALL_BY_NAME
> >>          4        EXT_FCALL_BEGIN
> >>   17     5        INIT_ARRAY                                       ~1
> >> <true>, 'stop_on_error'
> >>          6        SEND_VAL_EX
> >> ~1
> >>          7        SEND_VAR_EX
> >> !0
> >>          8        DO_FCALL                                      0  $1
> >>          9        EXT_FCALL_END
> >>         10      > RETURN
> >>  $1
> >>
> >>
> >> PHP 7.1.4 (no OPcache)
> >> ======================
> >>
> >> filename:       /tmp/xdebug-bug-1/lib/Required2.php
> >> function name:  normalize_params
> >> number of ops:  14
> >> compiled vars:  !0 = $params
> >> line     #* E I O op                           fetch          ext
> >return
> >> operands
> >> ------------------------------------------------------------
> >> -------------------------
> >>   11     0  E >   EXT_NOP
> >>          1        RECV                                             !0
> >>   13     2        EXT_STMT
> >>          3        INIT_NS_FCALL_BY_NAME
> >>          4        EXT_FCALL_BEGIN
> >>   15     5        FETCH_CLASS_CONSTANT                             ~1
> >> 'OPTION_STOP_ON_ERROR'
> >>          6        INIT_ARRAY                                       ~2
> >> <true>, ~1
> >>          7        SEND_VAL_EX
> >> ~2
> >>          8        SEND_VAR_EX
> >> !0
> >>          9        DO_FCALL_BY_NAME
> >>         10        EXT_FCALL_END
> >>         11      > RETURN
> >>  $3
> >>   18    12*       EXT_STMT
> >>         13*     > RETURN
> >>  null
> >>
> >>
> >> PHP 7.1.4 (OPcache)
> >> ======================
> >>
> >> filename:       /tmp/xdebug-bug-1/lib/Required2.php
> >> function name:  normalize_params
> >> number of ops:  11
> >> compiled vars:  !0 = $params
> >> line     #* E I O op                           fetch          ext
> >return
> >> operands
> >> ------------------------------------------------------------
> >> -------------------------
> >>   11     0  E >   EXT_NOP
> >>          1        RECV                                             !0
> >>   13     2        EXT_STMT
> >>          3        INIT_NS_FCALL_BY_NAME
> >>          4        EXT_FCALL_BEGIN
> >>   15     5        INIT_ARRAY                                       ~1
> >> <true>, 'stop_on_error'
> >>          6        SEND_VAL_EX
> >> ~1
> >>          7        SEND_VAR_EX
> >> !0
> >>          8        DO_FCALL                                      0  $1
> >>          9        EXT_FCALL_END
> >>         10      > RETURN
> >>  $1
> >>
> >> cheers,
> >> Derick
> >>
> >
> >This is due to
> >https://github.com/php/php-src/commit/183cd048f18fa4b04fb30448a84a54
> cee80a2491,
> >which fixed lineno assignment for list AST nodes. This changed the
> >start
> >lineno of the array from line 17 (the end of the array) to line 15 (the
> >first array element). Of course this is still inaccurate (the actual
> >start
> >line is 13), but it's the closest we can get with the information we
> >currently have available.
> >
> >The problem in this case is that the second SEND_VAR_EX did not bump
> >the
> >lineno. I've fixed this in
> >https://github.com/php/php-src/commit/e433c23b96e81340cd0e2d0b4b7f5f
> ce7f72a931
> >.
> >
> >This required a change to an existing test, which alerted me to some
> >weird
> >behavior I wasn't aware of: https://3v4l.org/6fSRb In backtraces the
> >call
> >is located on the line of it's last argument (in PHP 5.6 the line of
> >the
> >closing ")"). Wouldn't it make more sense to use the starting line of
> >the
> >call? That is, use the same lineno for INIT_FCALL and DO_FCALL?
> >
> >Nikita
>
> It makes sense to me to use the first line, as long as further opcodes
> will have the right line  number.
>

I agree the first line makes sense.


> Selfishly, I'd prefer if that change was only made for master, due to the
> increasingly complex tests I need to make for Xdebug's code coverage.


That means it will go into 7.2 and not into any 7.1 fix, correct?

Reply via email to