This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Eliminate SvPADMY tests from overload code
authorDavid Mitchell <davem@iabyn.com>
Mon, 4 Feb 2019 14:11:13 +0000 (14:11 +0000)
committerDavid Mitchell <davem@iabyn.com>
Tue, 5 Feb 2019 14:03:05 +0000 (14:03 +0000)
commit7554d34485b417b08875137130152d0168feefa8
tree6c58d0ff08d206716acf1f1fb13b34225ec3eba6
parent72876cce4ecc7d8756e00d284e32df0b943d0da9
Eliminate SvPADMY tests from overload code

A couple of places in the overload code do  SvPADMY(TARG) to decide
whether this is a normal op like ($x op $y), where the targ will have
SVs_PADTMP set, or a lexical assignment like $lex = ($x op $y) where the
assign has been optimised away and the op is expected to directly assign
to the targ which it thinks is a PADTMP but is really $lex.

Since the SVs_PADMY flag was eliminated a while ago, SvPADMY() is just
defined as !(SvFLAGS(sv) & SVs_PADTMP). Thus the overload code is
relying on the absence of a PADTMP flag in the target to deduce that the
OPpTARGET_MY optimisation is in effect. This seems to work (at least for
the code in the test suite), but can't be regarded as robust. This
commit removes each SvPADMY() test and replaces it with the twin

            if (   (PL_opargs[PL_op->op_type] & OA_TARGLEX)
                && (PL_op->op_private & OPpTARGET_MY))

tests.
gv.c
pp_hot.c