This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
for my $x (...): $x is always stale
authorDavid Mitchell <davem@iabyn.com>
Sun, 19 Jul 2015 09:51:38 +0000 (10:51 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Feb 2016 08:59:38 +0000 (08:59 +0000)
Remove the code in pp_enteriter that turns $x's staleness off and schedules
on the save stack for it to be turned back on at scope exit.

Since 'for my $x' works by making $x's pad slot temporarily point to
each item in turn, the "real" $x which lives in the pad outside of loop
time can never be accessed by the usual closure tricks (BEGIN, eval,
nested named subs etc) during a loop, so doesn't need to be marked as not
stale.

Skipping this step is one less thing to be pushed onto the save stack
on each for loop entry.

pp_ctl.c

index cef91f5..6e4173b 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -2125,9 +2125,10 @@ PP(pp_enteriter)
 
     if (PL_op->op_targ) {                       /* "my" variable */
        if (PL_op->op_private & OPpLVAL_INTRO) {        /* for my $x (...) */
-           SvPADSTALE_off(PAD_SVl(PL_op->op_targ));
-           SAVESETSVFLAGS(PAD_SVl(PL_op->op_targ),
-                   SVs_PADSTALE, SVs_PADSTALE);
+            /* the SV currently in the pad slot is never live during
+             * iteration (the slot is always aliased to one of the items)
+             * so it's always stale */
+           SvPADSTALE_on(PAD_SVl(PL_op->op_targ));
        }
        SAVEPADSVANDMORTALIZE(PL_op->op_targ);
        itervar = &PAD_SVl(PL_op->op_targ);