[perl #77452] Deparse { ...; BEGIN{} } correctly
authorFather Chrysostomos <sprout@cpan.org>
Thu, 20 Nov 2014 17:23:35 +0000 (09:23 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 21 Nov 2014 04:17:18 +0000 (20:17 -0800)
8635e3c2 (5.21.6) changed the COP sequence numbers for nested blocks,
such that most BEGIN blocks (incl. ‘use’ statements) and sub declara-
tions end up in the right place.  However, it had the side effect of
causing declarations at the end of the enclosing scope to fall out of
it and appear below.

This commit fixes that by adding an extra nulled COP to the end of the
enclosing scope if that scope ends with a sub, so the final declara-
tion gets deparsed before it.

The frequency of sub declarations at the end of the enclosing scope is
sufficiently low (I’m guessing a bit here) that this slight increase
in run-time memory usage is probably acceptable.

I had to change B::Deparse to deparse nulled COPs the same way it does
live COPs, which means we get more extraneous semicolons than before.
I hope to fix that in a forthcoming commit.  I also ran into a B bug,
in that null ops are not presented to Perl code with the right op
class (see the blessing in the patch).  I plan to fix that in a separ-
ate commit, too.

ext/B/t/concise-xs.t
lib/B/Deparse.pm
lib/B/Deparse.t
op.c
parser.h
perly.act
perly.h
perly.tab
perly.y

index 4959a4a..365951d 100644 (file)
@@ -158,7 +158,7 @@ my $testpkgs = {
 
        constant => [qw/ ASSIGN CVf_LVALUE
                     CVf_METHOD LIST_CONTEXT OP_CONST OP_LIST OP_RV2SV
-                    OP_AELEM OP_CUSTOM
+                    OP_AELEM OP_CUSTOM OP_NEXTSTATE OP_DBSTATE
                     OP_STRINGIFY OPf_KIDS OPf_MOD OPf_REF OPf_SPECIAL
                     OPf_PARENS
                     OPf_STACKED OPf_WANT OPf_WANT_LIST OPf_WANT_SCALAR
index 1e42ef1..e35a7ae 100644 (file)
@@ -324,7 +324,7 @@ BEGIN {
 
 
 BEGIN { for (qw[ const stringify rv2sv list glob pushmark null aelem
-                custom ]) {
+                custom nextstate dbstate ]) {
     eval "sub OP_\U$_ () { " . opnumber($_) . "}"
 }}
 
@@ -1442,7 +1442,7 @@ sub walk_lineseq {
            next;
        }
        my $expr2 = $self->deparse($kids[$i], (@kids != 1)/2);
-       $expr2 =~ s/^sub :/+sub :/; # statement label otherwise
+       $expr2 =~ s/^sub :(?!:)/+sub :/; # statement label otherwise
        $expr .= $expr2;
        $expr =~ s/;\n?\z//;
        $callback->($expr, $i);
@@ -3371,11 +3371,14 @@ sub _op_is_or_was {
 }
 
 sub pp_null {
-    my $self = shift;
-    my($op, $cx) = @_;
+    my($self, $op, $cx) = @_;
     if (class($op) eq "OP") {
        # old value is lost
        return $self->{'ex_const'} if $op->targ == OP_CONST;
+       if ($op->targ == OP_NEXTSTATE || $op->targ == OP_DBSTATE) {
+           bless $op, "B::COP"; # XXX B bug
+           return &pp_nextstate;
+       }
     } elsif ($op->first->name eq 'pushmark'
              or $op->first->name eq 'null'
                 && $op->first->targ == OP_PUSHMARK
index 5b7d9cd..32daab5 100644 (file)
@@ -13,7 +13,7 @@ BEGIN {
 use warnings;
 use strict;
 
-my $tests = 28; # not counting those in the __DATA__ section
+my $tests = 29; # not counting those in the __DATA__ section
 
 use B::Deparse;
 my $deparse = B::Deparse->new();
@@ -140,7 +140,7 @@ like($a, qr/$b/,
 
 $a = `$^X $path "-MO=Deparse" -e "use constant PI => 4" 2>&1`;
 $a =~ s/-e syntax OK\n//g;
-is($a, "use constant ('PI', 4);\n",
+is($a, "();\nuse constant ('PI', 4);\n",
    "Proxy Constant Subroutines must not show up as (incorrect) prototypes");
 
 #Re: perlbug #35857, patch #24505
@@ -188,12 +188,14 @@ EOFCODE
 $a = `$^X $path "-MO=Deparse" -e "sub ::::{}sub ::::::{}" 2>&1`;
 $a =~ s/-e syntax OK\n//g;
 is($a, <<'EOCODG', "sub :::: and sub ::::::");
+();
 sub :::: {
     
 }
 sub :::::: {
     
 }
+;
 EOCODG
 
 # [perl #117311]
@@ -224,12 +226,14 @@ $a =
   `$^X $path "-MO=Deparse" -e "BEGIN{*CORE::GLOBAL::require=sub{1}}" 2>&1`;
 $a =~ s/-e syntax OK\n//g;
 is($a, <<'EOCODF', "CORE::GLOBAL::require override causing panick");
+();
 sub BEGIN {
     *CORE::GLOBAL::require = sub {
         1;
     }
     ;
 }
+;
 EOCODF
 
 # [perl #91384]
@@ -317,7 +321,7 @@ like($a, qr/my sub use;\n\(\);\nCORE::use less;/,
 $a = readpipe qq`$^X $path "-MO=Deparse" -Xe `
              .qq`"use feature q|:all|; my sub __DATA__; `
              .qq`CORE::__DATA__" 2>&1`;
-like($a, qr/my sub __DATA__;\n\(\);\nCORE::__DATA__/,
+like($a, qr/my sub __DATA__;\n.*\nCORE::__DATA__/s,
     'CORE::__DATA__ after my sub __DATA__');
 
 # sub declarations
@@ -362,6 +366,34 @@ sub BEGIN {
 }
 EOCODJ
 }
+is runperl(stderr => 1, switches => [ '-MO=-qq,Deparse', $path ], prog => '
+      {
+        {
+          die;
+          BEGIN { pop }
+        }
+        BEGIN { pop }
+      }
+      BEGIN { pop }
+  '), <<'EOCODL', 'BEGIN blocks at the end of their enclosing blocks';
+{
+    {
+        die;
+        sub BEGIN {
+            pop @ARGV;
+        }
+        ;
+    }
+    sub BEGIN {
+        pop @ARGV;
+    }
+    ;
+}
+sub BEGIN {
+    pop @ARGV;
+}
+;
+EOCODL
 
 # [perl #115066]
 my $prog = 'use constant FOO => do { 1 }; no overloading; die';
diff --git a/op.c b/op.c
index 728b927..c170a34 100644 (file)
--- a/op.c
+++ b/op.c
@@ -1547,7 +1547,10 @@ Perl_scalar(pTHX_ OP *o)
     do_kids:
        while (kid) {
            OP *sib = OP_SIBLING(kid);
-           if (sib && kid->op_type != OP_LEAVEWHEN)
+           if (sib && kid->op_type != OP_LEAVEWHEN
+            && (  OP_HAS_SIBLING(sib) || sib->op_type != OP_NULL
+               || (  sib->op_targ != OP_NEXTSTATE
+                  && sib->op_targ != OP_DBSTATE  )))
                scalarvoid(kid);
            else
                scalar(kid);
@@ -3739,6 +3742,14 @@ Perl_block_end(pTHX_ I32 floor, OP *seq)
     OP* retval = scalarseq(seq);
     OP *o;
 
+    /* XXX Is the null PL_parser check necessary here? */
+    assert(PL_parser); /* Let’s find out under debugging builds.  */
+    if (PL_parser && PL_parser->parsed_sub) {
+       o = newSTATEOP(0, NULL, NULL);
+       op_null(o);
+       retval = op_append_elem(OP_LINESEQ, retval, o);
+    }
+
     CALL_BLOCK_HOOKS(bhk_pre_end, &retval);
 
     LEAVE_SCOPE(floor);
@@ -6479,6 +6490,8 @@ Perl_newSTATEOP(pTHX_ I32 flags, char *label, OP *o)
     const U32 utf8 = flags & SVf_UTF8;
     COP *cop;
 
+    PL_parser->parsed_sub = 0;
+
     flags &= ~SVf_UTF8;
 
     NewOp(1101, cop, 1, COP);
index 11367b6..2806578 100644 (file)
--- a/parser.h
+++ b/parser.h
@@ -111,6 +111,7 @@ typedef struct yy_parser {
     PERL_BITFIELD16    in_pod:1;      /* lexer is within a =pod section */
     PERL_BITFIELD16    filtered:1;    /* source filters in evalbytes */
     PERL_BITFIELD16    saw_infix_sigil:1; /* saw & or * or % operator */
+    PERL_BITFIELD16    parsed_sub:1;  /* last thing parsed was a sub */
 } yy_parser;
 
 /* flags for lexer API */
index a6f5522..f0a55ff 100644 (file)
--- a/perly.act
+++ b/perly.act
@@ -122,11 +122,12 @@ case 2:
 
   case 16:
 #line 197 "perly.y"
-    { (yyval.ival) = block_start(TRUE); ;}
+    { (yyval.ival) = block_start(TRUE);
+                         parser->parsed_sub = 0; ;}
     break;
 
   case 17:
-#line 201 "perly.y"
+#line 202 "perly.y"
     { if (parser->copline > (line_t)(ps[(1) - (4)].val.ival))
                              parser->copline = (line_t)(ps[(1) - (4)].val.ival);
                          (yyval.opval) = block_end((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval));
@@ -134,17 +135,18 @@ case 2:
     break;
 
   case 18:
-#line 208 "perly.y"
-    { (yyval.ival) = block_start(FALSE); ;}
+#line 209 "perly.y"
+    { (yyval.ival) = block_start(FALSE);
+                         parser->parsed_sub = 0; ;}
     break;
 
   case 19:
-#line 213 "perly.y"
+#line 215 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 20:
-#line 215 "perly.y"
+#line 217 "perly.y"
     {   (yyval.opval) = op_append_list(OP_LINESEQ, (ps[(1) - (2)].val.opval), (ps[(2) - (2)].val.opval));
                            PL_pad_reset_pending = TRUE;
                            if ((ps[(1) - (2)].val.opval) && (ps[(2) - (2)].val.opval))
@@ -153,12 +155,12 @@ case 2:
     break;
 
   case 21:
-#line 224 "perly.y"
+#line 226 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 22:
-#line 226 "perly.y"
+#line 228 "perly.y"
     {   (yyval.opval) = op_append_list(OP_LINESEQ, (ps[(1) - (2)].val.opval), (ps[(2) - (2)].val.opval));
                            PL_pad_reset_pending = TRUE;
                            if ((ps[(1) - (2)].val.opval) && (ps[(2) - (2)].val.opval))
@@ -167,38 +169,38 @@ case 2:
     break;
 
   case 23:
-#line 235 "perly.y"
+#line 237 "perly.y"
     {
                          (yyval.opval) = (ps[(1) - (1)].val.opval) ? newSTATEOP(0, NULL, (ps[(1) - (1)].val.opval)) : NULL;
                        ;}
     break;
 
   case 24:
-#line 239 "perly.y"
+#line 241 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 25:
-#line 243 "perly.y"
+#line 245 "perly.y"
     {
                          (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[(1) - (2)].val.pval)[strlen((ps[(1) - (2)].val.pval))+1], (ps[(1) - (2)].val.pval), (ps[(2) - (2)].val.opval));
                        ;}
     break;
 
   case 26:
-#line 247 "perly.y"
+#line 249 "perly.y"
     {
                          (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[(1) - (2)].val.pval)[strlen((ps[(1) - (2)].val.pval))+1], (ps[(1) - (2)].val.pval), (ps[(2) - (2)].val.opval));
                        ;}
     break;
 
   case 27:
-#line 254 "perly.y"
+#line 256 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 28:
-#line 256 "perly.y"
+#line 258 "perly.y"
     {
                          CV *fmtcv = PL_compcv;
                          newFORM((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval), (ps[(4) - (4)].val.opval));
@@ -211,7 +213,7 @@ case 2:
     break;
 
   case 29:
-#line 266 "perly.y"
+#line 268 "perly.y"
     {
                          if ((ps[(2) - (3)].val.opval)->op_type == OP_CONST) {
                            const char *const name =
@@ -236,7 +238,7 @@ case 2:
     break;
 
   case 30:
-#line 288 "perly.y"
+#line 290 "perly.y"
     {
                          SvREFCNT_inc_simple_void(PL_compcv);
                          (ps[(2) - (7)].val.opval)->op_type == OP_CONST
@@ -245,11 +247,12 @@ case 2:
                          ;
                          (yyval.opval) = (OP*)NULL;
                          intro_my();
+                         parser->parsed_sub = 1;
                        ;}
     break;
 
   case 31:
-#line 298 "perly.y"
+#line 301 "perly.y"
     {
                          package((ps[(3) - (4)].val.opval));
                          if ((ps[(2) - (4)].val.opval))
@@ -259,21 +262,22 @@ case 2:
     break;
 
   case 32:
-#line 305 "perly.y"
+#line 308 "perly.y"
     { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ ;}
     break;
 
   case 33:
-#line 307 "perly.y"
+#line 310 "perly.y"
     {
                          SvREFCNT_inc_simple_void(PL_compcv);
                          utilize((ps[(1) - (7)].val.ival), (ps[(2) - (7)].val.ival), (ps[(4) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval));
+                         parser->parsed_sub = 1;
                          (yyval.opval) = (OP*)NULL;
                        ;}
     break;
 
   case 34:
-#line 313 "perly.y"
+#line 317 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(3) - (7)].val.ival),
                              newCONDOP(0, (ps[(4) - (7)].val.opval), op_scope((ps[(6) - (7)].val.opval)), (ps[(7) - (7)].val.opval)));
@@ -282,7 +286,7 @@ case 2:
     break;
 
   case 35:
-#line 319 "perly.y"
+#line 323 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(3) - (7)].val.ival),
                              newCONDOP(0, (ps[(4) - (7)].val.opval), op_scope((ps[(6) - (7)].val.opval)), (ps[(7) - (7)].val.opval)));
@@ -291,7 +295,7 @@ case 2:
     break;
 
   case 36:
-#line 325 "perly.y"
+#line 329 "perly.y"
     {
                          const PADOFFSET offset = pad_findmy_pvs("$_", 0);
                          (yyval.opval) = block_end((ps[(3) - (6)].val.ival),
@@ -305,17 +309,17 @@ case 2:
     break;
 
   case 37:
-#line 336 "perly.y"
+#line 340 "perly.y"
     { (yyval.opval) = block_end((ps[(3) - (6)].val.ival), newWHENOP((ps[(4) - (6)].val.opval), op_scope((ps[(6) - (6)].val.opval)))); ;}
     break;
 
   case 38:
-#line 338 "perly.y"
+#line 342 "perly.y"
     { (yyval.opval) = newWHENOP(0, op_scope((ps[(2) - (2)].val.opval))); ;}
     break;
 
   case 39:
-#line 340 "perly.y"
+#line 344 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(3) - (8)].val.ival),
                                  newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
@@ -325,7 +329,7 @@ case 2:
     break;
 
   case 40:
-#line 347 "perly.y"
+#line 351 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(3) - (8)].val.ival),
                                  newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
@@ -335,17 +339,17 @@ case 2:
     break;
 
   case 41:
-#line 354 "perly.y"
+#line 358 "perly.y"
     { parser->expect = XTERM; ;}
     break;
 
   case 42:
-#line 356 "perly.y"
+#line 360 "perly.y"
     { parser->expect = XTERM; ;}
     break;
 
   case 43:
-#line 359 "perly.y"
+#line 363 "perly.y"
     {
                          OP *initop = (ps[(4) - (13)].val.opval);
                          OP *forop = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
@@ -362,7 +366,7 @@ case 2:
     break;
 
   case 44:
-#line 373 "perly.y"
+#line 377 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(3) - (9)].val.ival), newFOROP(0, (ps[(4) - (9)].val.opval), (ps[(6) - (9)].val.opval), (ps[(8) - (9)].val.opval), (ps[(9) - (9)].val.opval)));
                          parser->copline = (line_t)(ps[(1) - (9)].val.ival);
@@ -370,7 +374,7 @@ case 2:
     break;
 
   case 45:
-#line 378 "perly.y"
+#line 382 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(4) - (8)].val.ival), newFOROP(0,
                                      op_lvalue((ps[(2) - (8)].val.opval), OP_ENTERLOOP), (ps[(5) - (8)].val.opval), (ps[(7) - (8)].val.opval), (ps[(8) - (8)].val.opval)));
@@ -379,12 +383,12 @@ case 2:
     break;
 
   case 46:
-#line 384 "perly.y"
+#line 388 "perly.y"
     { parser->in_my = 0; (yyval.opval) = my((ps[(5) - (5)].val.opval)); ;}
     break;
 
   case 47:
-#line 386 "perly.y"
+#line 390 "perly.y"
     {
                          (yyval.opval) = block_end(
                                (ps[(4) - (11)].val.ival),
@@ -400,7 +404,7 @@ case 2:
     break;
 
   case 48:
-#line 399 "perly.y"
+#line 403 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(5) - (9)].val.ival), newFOROP(
                                0, op_lvalue(newUNOP(OP_REFGEN, 0,
@@ -411,7 +415,7 @@ case 2:
     break;
 
   case 49:
-#line 407 "perly.y"
+#line 411 "perly.y"
     {
                          (yyval.opval) = block_end((ps[(3) - (7)].val.ival),
                                  newFOROP(0, (OP*)NULL, (ps[(4) - (7)].val.opval), (ps[(6) - (7)].val.opval), (ps[(7) - (7)].val.opval)));
@@ -420,7 +424,7 @@ case 2:
     break;
 
   case 50:
-#line 413 "perly.y"
+#line 417 "perly.y"
     {
                          /* a block is a loop that happens once */
                          (yyval.opval) = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
@@ -429,7 +433,7 @@ case 2:
     break;
 
   case 51:
-#line 419 "perly.y"
+#line 423 "perly.y"
     {
                          package((ps[(3) - (5)].val.opval));
                          if ((ps[(2) - (5)].val.opval)) {
@@ -439,7 +443,7 @@ case 2:
     break;
 
   case 52:
-#line 426 "perly.y"
+#line 430 "perly.y"
     {
                          /* a block is a loop that happens once */
                          (yyval.opval) = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
@@ -450,14 +454,14 @@ case 2:
     break;
 
   case 53:
-#line 434 "perly.y"
+#line 438 "perly.y"
     {
                          (yyval.opval) = (ps[(1) - (2)].val.opval);
                        ;}
     break;
 
   case 54:
-#line 438 "perly.y"
+#line 442 "perly.y"
     {
                          (yyval.opval) = (OP*)NULL;
                          parser->copline = NOLINE;
@@ -465,7 +469,7 @@ case 2:
     break;
 
   case 55:
-#line 446 "perly.y"
+#line 450 "perly.y"
     { OP *list;
                          if ((ps[(2) - (2)].val.opval)) {
                              OP *term = (ps[(2) - (2)].val.opval);
@@ -483,63 +487,63 @@ case 2:
     break;
 
   case 56:
-#line 463 "perly.y"
+#line 467 "perly.y"
     { (yyval.opval) = NULL; ;}
     break;
 
   case 57:
-#line 465 "perly.y"
+#line 469 "perly.y"
     { (yyval.opval) = op_unscope((ps[(2) - (3)].val.opval)); ;}
     break;
 
   case 58:
-#line 470 "perly.y"
+#line 474 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 59:
-#line 472 "perly.y"
+#line 476 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 60:
-#line 474 "perly.y"
+#line 478 "perly.y"
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); ;}
     break;
 
   case 61:
-#line 476 "perly.y"
+#line 480 "perly.y"
     { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); ;}
     break;
 
   case 62:
-#line 478 "perly.y"
+#line 482 "perly.y"
     { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[(3) - (3)].val.opval)), (ps[(1) - (3)].val.opval)); ;}
     break;
 
   case 63:
-#line 480 "perly.y"
+#line 484 "perly.y"
     { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval)); ;}
     break;
 
   case 64:
-#line 482 "perly.y"
+#line 486 "perly.y"
     { (yyval.opval) = newFOROP(0, (OP*)NULL, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval), (OP*)NULL);
                          parser->copline = (line_t)(ps[(2) - (3)].val.ival); ;}
     break;
 
   case 65:
-#line 485 "perly.y"
+#line 489 "perly.y"
     { (yyval.opval) = newWHENOP((ps[(3) - (3)].val.opval), op_scope((ps[(1) - (3)].val.opval))); ;}
     break;
 
   case 66:
-#line 490 "perly.y"
+#line 494 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 67:
-#line 492 "perly.y"
+#line 496 "perly.y"
     {
                          ((ps[(2) - (2)].val.opval))->op_flags |= OPf_PARENS;
                          (yyval.opval) = op_scope((ps[(2) - (2)].val.opval));
@@ -547,7 +551,7 @@ case 2:
     break;
 
   case 68:
-#line 497 "perly.y"
+#line 501 "perly.y"
     { parser->copline = (line_t)(ps[(1) - (6)].val.ival);
                            (yyval.opval) = newCONDOP(0,
                                newSTATEOP(OPf_SPECIAL,NULL,(ps[(3) - (6)].val.opval)),
@@ -557,119 +561,119 @@ case 2:
     break;
 
   case 69:
-#line 507 "perly.y"
+#line 511 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 70:
-#line 509 "perly.y"
+#line 513 "perly.y"
     { (yyval.opval) = op_scope((ps[(2) - (2)].val.opval)); ;}
     break;
 
   case 71:
-#line 514 "perly.y"
+#line 518 "perly.y"
     { (yyval.ival) = (PL_min_intro_pending &&
                            PL_max_intro_pending >=  PL_min_intro_pending);
                          intro_my(); ;}
     break;
 
   case 72:
-#line 520 "perly.y"
+#line 524 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 74:
-#line 526 "perly.y"
+#line 530 "perly.y"
     { YYSTYPE tmplval;
                          (void)scan_num("1", &tmplval);
                          (yyval.opval) = tmplval.opval; ;}
     break;
 
   case 76:
-#line 534 "perly.y"
+#line 538 "perly.y"
     { (yyval.opval) = invert(scalar((ps[(1) - (1)].val.opval))); ;}
     break;
 
   case 77:
-#line 539 "perly.y"
+#line 543 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); ;}
     break;
 
   case 78:
-#line 543 "perly.y"
+#line 547 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); ;}
     break;
 
   case 79:
-#line 547 "perly.y"
+#line 551 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); ;}
     break;
 
   case 80:
-#line 550 "perly.y"
+#line 554 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 81:
-#line 551 "perly.y"
+#line 555 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 82:
-#line 555 "perly.y"
+#line 559 "perly.y"
     { (yyval.ival) = start_subparse(FALSE, 0);
                            SAVEFREESV(PL_compcv); ;}
     break;
 
   case 83:
-#line 561 "perly.y"
+#line 565 "perly.y"
     { (yyval.ival) = start_subparse(FALSE, CVf_ANON);
                            SAVEFREESV(PL_compcv); ;}
     break;
 
   case 84:
-#line 566 "perly.y"
+#line 570 "perly.y"
     { (yyval.ival) = start_subparse(TRUE, 0);
                            SAVEFREESV(PL_compcv); ;}
     break;
 
   case 87:
-#line 577 "perly.y"
+#line 581 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 89:
-#line 583 "perly.y"
+#line 587 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 90:
-#line 585 "perly.y"
+#line 589 "perly.y"
     { (yyval.opval) = (ps[(2) - (2)].val.opval); ;}
     break;
 
   case 91:
-#line 587 "perly.y"
+#line 591 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 92:
-#line 592 "perly.y"
+#line 596 "perly.y"
     { (yyval.opval) = (ps[(2) - (2)].val.opval); ;}
     break;
 
   case 93:
-#line 594 "perly.y"
+#line 598 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 94:
-#line 598 "perly.y"
+#line 602 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 95:
-#line 600 "perly.y"
+#line 604 "perly.y"
     {
                          if (!FEATURE_SIGNATURES_IS_ENABLED)
                            Perl_croak(aTHX_ "Experimental "
@@ -682,7 +686,7 @@ case 2:
     break;
 
   case 96:
-#line 610 "perly.y"
+#line 614 "perly.y"
     {
                          (yyval.opval) = op_append_list(OP_LINESEQ, (ps[(2) - (3)].val.opval),
                                newSTATEOP(0, NULL, sawparens(newNULLLIST())));
@@ -691,7 +695,7 @@ case 2:
     break;
 
   case 97:
-#line 619 "perly.y"
+#line 623 "perly.y"
     {
                          if (parser->copline > (line_t)(ps[(3) - (5)].val.ival))
                              parser->copline = (line_t)(ps[(3) - (5)].val.ival);
@@ -701,37 +705,37 @@ case 2:
     break;
 
   case 98:
-#line 628 "perly.y"
+#line 632 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 99:
-#line 629 "perly.y"
+#line 633 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 100:
-#line 634 "perly.y"
+#line 638 "perly.y"
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); ;}
     break;
 
   case 101:
-#line 636 "perly.y"
+#line 640 "perly.y"
     { (yyval.opval) = newLOGOP((ps[(2) - (3)].val.ival), 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); ;}
     break;
 
   case 102:
-#line 638 "perly.y"
+#line 642 "perly.y"
     { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); ;}
     break;
 
   case 104:
-#line 644 "perly.y"
+#line 648 "perly.y"
     { (yyval.opval) = (ps[(1) - (2)].val.opval); ;}
     break;
 
   case 105:
-#line 646 "perly.y"
+#line 650 "perly.y"
     { 
                          OP* term = (ps[(3) - (3)].val.opval);
                          (yyval.opval) = op_append_elem(OP_LIST, (ps[(1) - (3)].val.opval), term);
@@ -739,21 +743,21 @@ case 2:
     break;
 
   case 107:
-#line 655 "perly.y"
+#line 659 "perly.y"
     { (yyval.opval) = op_convert_list((ps[(1) - (3)].val.ival), OPf_STACKED,
                                op_prepend_elem(OP_LIST, newGVREF((ps[(1) - (3)].val.ival),(ps[(2) - (3)].val.opval)), (ps[(3) - (3)].val.opval)) );
                        ;}
     break;
 
   case 108:
-#line 659 "perly.y"
+#line 663 "perly.y"
     { (yyval.opval) = op_convert_list((ps[(1) - (5)].val.ival), OPf_STACKED,
                                op_prepend_elem(OP_LIST, newGVREF((ps[(1) - (5)].val.ival),(ps[(3) - (5)].val.opval)), (ps[(4) - (5)].val.opval)) );
                        ;}
     break;
 
   case 109:
-#line 663 "perly.y"
+#line 667 "perly.y"
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, scalar((ps[(1) - (6)].val.opval)), (ps[(5) - (6)].val.opval)),
@@ -762,7 +766,7 @@ case 2:
     break;
 
   case 110:
-#line 669 "perly.y"
+#line 673 "perly.y"
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, scalar((ps[(1) - (3)].val.opval)),
                                    newMETHOP(OP_METHOD, 0, (ps[(3) - (3)].val.opval))));
@@ -770,7 +774,7 @@ case 2:
     break;
 
   case 111:
-#line 674 "perly.y"
+#line 678 "perly.y"
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, (ps[(2) - (3)].val.opval), (ps[(3) - (3)].val.opval)),
@@ -779,7 +783,7 @@ case 2:
     break;
 
   case 112:
-#line 680 "perly.y"
+#line 684 "perly.y"
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, (ps[(2) - (5)].val.opval), (ps[(4) - (5)].val.opval)),
@@ -788,23 +792,23 @@ case 2:
     break;
 
   case 113:
-#line 686 "perly.y"
+#line 690 "perly.y"
     { (yyval.opval) = op_convert_list((ps[(1) - (2)].val.ival), 0, (ps[(2) - (2)].val.opval)); ;}
     break;
 
   case 114:
-#line 688 "perly.y"
+#line 692 "perly.y"
     { (yyval.opval) = op_convert_list((ps[(1) - (4)].val.ival), 0, (ps[(3) - (4)].val.opval)); ;}
     break;
 
   case 115:
-#line 690 "perly.y"
+#line 694 "perly.y"
     { SvREFCNT_inc_simple_void(PL_compcv);
                          (yyval.opval) = newANONATTRSUB((ps[(2) - (3)].val.ival), 0, (OP*)NULL, (ps[(3) - (3)].val.opval)); ;}
     break;
 
   case 116:
-#line 693 "perly.y"
+#line 697 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                 op_append_elem(OP_LIST,
                                   op_prepend_elem(OP_LIST, (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)), (ps[(1) - (5)].val.opval)));
@@ -812,18 +816,18 @@ case 2:
     break;
 
   case 119:
-#line 708 "perly.y"
+#line 712 "perly.y"
     { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[(1) - (5)].val.opval), scalar((ps[(3) - (5)].val.opval))); ;}
     break;
 
   case 120:
-#line 710 "perly.y"
+#line 714 "perly.y"
     { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[(1) - (4)].val.opval)), scalar((ps[(3) - (4)].val.opval)));
                        ;}
     break;
 
   case 121:
-#line 713 "perly.y"
+#line 717 "perly.y"
     { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[(1) - (5)].val.opval)),OP_RV2AV),
                                        scalar((ps[(4) - (5)].val.opval)));
@@ -831,7 +835,7 @@ case 2:
     break;
 
   case 122:
-#line 718 "perly.y"
+#line 722 "perly.y"
     { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[(1) - (4)].val.opval)),OP_RV2AV),
                                        scalar((ps[(3) - (4)].val.opval)));
@@ -839,78 +843,78 @@ case 2:
     break;
 
   case 123:
-#line 723 "perly.y"
+#line 727 "perly.y"
     { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[(1) - (5)].val.opval)), jmaybe((ps[(3) - (5)].val.opval)));
                        ;}
     break;
 
   case 124:
-#line 726 "perly.y"
+#line 730 "perly.y"
     { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[(1) - (6)].val.opval)),OP_RV2HV),
                                        jmaybe((ps[(4) - (6)].val.opval))); ;}
     break;
 
   case 125:
-#line 730 "perly.y"
+#line 734 "perly.y"
     { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[(1) - (5)].val.opval)),OP_RV2HV),
                                        jmaybe((ps[(3) - (5)].val.opval))); ;}
     break;
 
   case 126:
-#line 734 "perly.y"
+#line 738 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar((ps[(1) - (4)].val.opval)))); ;}
     break;
 
   case 127:
-#line 737 "perly.y"
+#line 741 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   op_append_elem(OP_LIST, (ps[(4) - (5)].val.opval),
                                       newCVREF(0, scalar((ps[(1) - (5)].val.opval))))); ;}
     break;
 
   case 128:
-#line 742 "perly.y"
+#line 746 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   op_append_elem(OP_LIST, (ps[(3) - (4)].val.opval),
                                               newCVREF(0, scalar((ps[(1) - (4)].val.opval))))); ;}
     break;
 
   case 129:
-#line 746 "perly.y"
+#line 750 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar((ps[(1) - (3)].val.opval)))); ;}
     break;
 
   case 130:
-#line 749 "perly.y"
+#line 753 "perly.y"
     { (yyval.opval) = newSLICEOP(0, (ps[(5) - (6)].val.opval), (ps[(2) - (6)].val.opval)); ;}
     break;
 
   case 131:
-#line 751 "perly.y"
+#line 755 "perly.y"
     { (yyval.opval) = newSLICEOP(0, (ps[(3) - (4)].val.opval), (ps[(1) - (4)].val.opval)); ;}
     break;
 
   case 132:
-#line 753 "perly.y"
+#line 757 "perly.y"
     { (yyval.opval) = newSLICEOP(0, (ps[(4) - (5)].val.opval), (OP*)NULL); ;}
     break;
 
   case 133:
-#line 758 "perly.y"
+#line 762 "perly.y"
     { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[(1) - (3)].val.opval), (ps[(2) - (3)].val.ival), (ps[(3) - (3)].val.opval)); ;}
     break;
 
   case 134:
-#line 760 "perly.y"
+#line 764 "perly.y"
     { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); ;}
     break;
 
   case 135:
-#line 762 "perly.y"
+#line 766 "perly.y"
     {   if ((ps[(2) - (3)].val.ival) != OP_REPEAT)
                                scalar((ps[(1) - (3)].val.opval));
                            (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, (ps[(1) - (3)].val.opval), scalar((ps[(3) - (3)].val.opval)));
@@ -918,94 +922,94 @@ case 2:
     break;
 
   case 136:
-#line 767 "perly.y"
+#line 771 "perly.y"
     { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); ;}
     break;
 
   case 137:
-#line 769 "perly.y"
+#line 773 "perly.y"
     { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); ;}
     break;
 
   case 138:
-#line 771 "perly.y"
+#line 775 "perly.y"
     { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); ;}
     break;
 
   case 139:
-#line 773 "perly.y"
+#line 777 "perly.y"
     { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); ;}
     break;
 
   case 140:
-#line 775 "perly.y"
+#line 779 "perly.y"
     { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); ;}
     break;
 
   case 141:
-#line 777 "perly.y"
+#line 781 "perly.y"
     { (yyval.opval) = newBINOP((ps[(2) - (3)].val.ival), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); ;}
     break;
 
   case 142:
-#line 779 "perly.y"
+#line 783 "perly.y"
     { (yyval.opval) = newRANGE((ps[(2) - (3)].val.ival), scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); ;}
     break;
 
   case 143:
-#line 781 "perly.y"
+#line 785 "perly.y"
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); ;}
     break;
 
   case 144:
-#line 783 "perly.y"
+#line 787 "perly.y"
     { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); ;}
     break;
 
   case 145:
-#line 785 "perly.y"
+#line 789 "perly.y"
     { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); ;}
     break;
 
   case 146:
-#line 787 "perly.y"
+#line 791 "perly.y"
     { (yyval.opval) = bind_match((ps[(2) - (3)].val.ival), (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); ;}
     break;
 
   case 147:
-#line 792 "perly.y"
+#line 796 "perly.y"
     { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[(2) - (2)].val.opval))); ;}
     break;
 
   case 148:
-#line 794 "perly.y"
+#line 798 "perly.y"
     { (yyval.opval) = (ps[(2) - (2)].val.opval); ;}
     break;
 
   case 149:
-#line 797 "perly.y"
+#line 801 "perly.y"
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval))); ;}
     break;
 
   case 150:
-#line 799 "perly.y"
+#line 803 "perly.y"
     { (yyval.opval) = newUNOP(OP_COMPLEMENT, 0, scalar((ps[(2) - (2)].val.opval))); ;}
     break;
 
   case 151:
-#line 801 "perly.y"
+#line 805 "perly.y"
     { (yyval.opval) = newUNOP(OP_POSTINC, 0,
                                        op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTINC)); ;}
     break;
 
   case 152:
-#line 804 "perly.y"
+#line 808 "perly.y"
     { (yyval.opval) = newUNOP(OP_POSTDEC, 0,
                                        op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTDEC));;}
     break;
 
   case 153:
-#line 807 "perly.y"
+#line 811 "perly.y"
     { (yyval.opval) = op_convert_list(OP_JOIN, 0,
                                       op_append_elem(
                                        OP_LIST,
@@ -1019,120 +1023,120 @@ case 2:
     break;
 
   case 154:
-#line 818 "perly.y"
+#line 822 "perly.y"
     { (yyval.opval) = newUNOP(OP_PREINC, 0,
                                        op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREINC)); ;}
     break;
 
   case 155:
-#line 821 "perly.y"
+#line 825 "perly.y"
     { (yyval.opval) = newUNOP(OP_PREDEC, 0,
                                        op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREDEC)); ;}
     break;
 
   case 156:
-#line 828 "perly.y"
+#line 832 "perly.y"
     { (yyval.opval) = newANONLIST((ps[(2) - (3)].val.opval)); ;}
     break;
 
   case 157:
-#line 830 "perly.y"
+#line 834 "perly.y"
     { (yyval.opval) = newANONLIST((OP*)NULL);;}
     break;
 
   case 158:
-#line 832 "perly.y"
+#line 836 "perly.y"
     { (yyval.opval) = newANONHASH((ps[(2) - (4)].val.opval)); ;}
     break;
 
   case 159:
-#line 834 "perly.y"
+#line 838 "perly.y"
     { (yyval.opval) = newANONHASH((OP*)NULL); ;}
     break;
 
   case 160:
-#line 836 "perly.y"
+#line 840 "perly.y"
     { SvREFCNT_inc_simple_void(PL_compcv);
                          (yyval.opval) = newANONATTRSUB((ps[(2) - (5)].val.ival), (ps[(3) - (5)].val.opval), (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)); ;}
     break;
 
   case 161:
-#line 843 "perly.y"
+#line 847 "perly.y"
     { (yyval.opval) = dofile((ps[(2) - (2)].val.opval), (ps[(1) - (2)].val.ival));;}
     break;
 
   case 162:
-#line 845 "perly.y"
+#line 849 "perly.y"
     { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[(2) - (2)].val.opval)));;}
     break;
 
   case 167:
-#line 853 "perly.y"
+#line 857 "perly.y"
     { (yyval.opval) = newCONDOP(0, (ps[(1) - (5)].val.opval), (ps[(3) - (5)].val.opval), (ps[(5) - (5)].val.opval)); ;}
     break;
 
   case 168:
-#line 855 "perly.y"
+#line 859 "perly.y"
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, op_lvalue((ps[(2) - (2)].val.opval),OP_REFGEN)); ;}
     break;
 
   case 169:
-#line 857 "perly.y"
+#line 861 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 170:
-#line 859 "perly.y"
+#line 863 "perly.y"
     { (yyval.opval) = localize((ps[(2) - (2)].val.opval),(ps[(1) - (2)].val.ival)); ;}
     break;
 
   case 171:
-#line 861 "perly.y"
+#line 865 "perly.y"
     { (yyval.opval) = sawparens((ps[(2) - (3)].val.opval)); ;}
     break;
 
   case 172:
-#line 863 "perly.y"
+#line 867 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 173:
-#line 865 "perly.y"
+#line 869 "perly.y"
     { (yyval.opval) = sawparens(newNULLLIST()); ;}
     break;
 
   case 174:
-#line 867 "perly.y"
+#line 871 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 175:
-#line 869 "perly.y"
+#line 873 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 176:
-#line 871 "perly.y"
+#line 875 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 177:
-#line 873 "perly.y"
+#line 877 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 178:
-#line 875 "perly.y"
+#line 879 "perly.y"
     { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[(1) - (1)].val.opval), OP_AV2ARYLEN));;}
     break;
 
   case 179:
-#line 877 "perly.y"
+#line 881 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 180:
-#line 879 "perly.y"
+#line 883 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_ASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_ASLICE, 0,
@@ -1145,7 +1149,7 @@ case 2:
     break;
 
   case 181:
-#line 889 "perly.y"
+#line 893 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_KVASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_KVASLICE, 0,
@@ -1158,7 +1162,7 @@ case 2:
     break;
 
   case 182:
-#line 899 "perly.y"
+#line 903 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_HSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_HSLICE, 0,
@@ -1171,7 +1175,7 @@ case 2:
     break;
 
   case 183:
-#line 909 "perly.y"
+#line 913 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_KVHSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_KVHSLICE, 0,
@@ -1184,23 +1188,23 @@ case 2:
     break;
 
   case 184:
-#line 919 "perly.y"
+#line 923 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 185:
-#line 921 "perly.y"
+#line 925 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[(1) - (1)].val.opval))); ;}
     break;
 
   case 186:
-#line 923 "perly.y"
+#line 927 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (3)].val.opval)));
                        ;}
     break;
 
   case 187:
-#line 926 "perly.y"
+#line 930 "perly.y"
     {
                          (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, (ps[(3) - (4)].val.opval), scalar((ps[(1) - (4)].val.opval))));
@@ -1208,129 +1212,129 @@ case 2:
     break;
 
   case 188:
-#line 931 "perly.y"
+#line 935 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            op_append_elem(OP_LIST, (ps[(3) - (3)].val.opval), scalar((ps[(2) - (3)].val.opval))));
                        ;}
     break;
 
   case 189:
-#line 935 "perly.y"
+#line 939 "perly.y"
     { (yyval.opval) = newSVREF((ps[(1) - (4)].val.opval)); ;}
     break;
 
   case 190:
-#line 937 "perly.y"
+#line 941 "perly.y"
     { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval)); ;}
     break;
 
   case 191:
-#line 939 "perly.y"
+#line 943 "perly.y"
     { (yyval.opval) = newHVREF((ps[(1) - (4)].val.opval)); ;}
     break;
 
   case 192:
-#line 941 "perly.y"
+#line 945 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, 0,
                                       scalar(newCVREF((ps[(3) - (4)].val.ival),(ps[(1) - (4)].val.opval)))); ;}
     break;
 
   case 193:
-#line 944 "perly.y"
+#line 948 "perly.y"
     { (yyval.opval) = newGVREF(0,(ps[(1) - (4)].val.opval)); ;}
     break;
 
   case 194:
-#line 946 "perly.y"
+#line 950 "perly.y"
     { (yyval.opval) = newOP((ps[(1) - (1)].val.ival), OPf_SPECIAL);
                            PL_hints |= HINT_BLOCK_SCOPE; ;}
     break;
 
   case 195:
-#line 949 "perly.y"
+#line 953 "perly.y"
     { (yyval.opval) = newLOOPEX((ps[(1) - (2)].val.ival),(ps[(2) - (2)].val.opval)); ;}
     break;
 
   case 196:
-#line 951 "perly.y"
+#line 955 "perly.y"
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval))); ;}
     break;
 
   case 197:
-#line 953 "perly.y"
+#line 957 "perly.y"
     { (yyval.opval) = newOP((ps[(1) - (1)].val.ival), 0); ;}
     break;
 
   case 198:
-#line 955 "perly.y"
+#line 959 "perly.y"
     { (yyval.opval) = newUNOP((ps[(1) - (2)].val.ival), 0, (ps[(2) - (2)].val.opval)); ;}
     break;
 
   case 199:
-#line 957 "perly.y"
+#line 961 "perly.y"
     { (yyval.opval) = newUNOP((ps[(1) - (2)].val.ival), 0, (ps[(2) - (2)].val.opval)); ;}
     break;
 
   case 200:
-#line 959 "perly.y"
+#line 963 "perly.y"
     { (yyval.opval) = newOP(OP_REQUIRE, (ps[(1) - (1)].val.ival) ? OPf_SPECIAL : 0); ;}
     break;
 
   case 201:
-#line 961 "perly.y"
+#line 965 "perly.y"
     { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[(1) - (2)].val.ival) ? OPf_SPECIAL : 0, (ps[(2) - (2)].val.opval)); ;}
     break;
 
   case 202:
-#line 963 "perly.y"
+#line 967 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); ;}
     break;
 
   case 203:
-#line 965 "perly.y"
+#line 969 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            op_append_elem(OP_LIST, (ps[(2) - (2)].val.opval), scalar((ps[(1) - (2)].val.opval)))); ;}
     break;
 
   case 204:
-#line 968 "perly.y"
+#line 972 "perly.y"
     { (yyval.opval) = newOP((ps[(1) - (1)].val.ival), 0); ;}
     break;
 
   case 205:
-#line 970 "perly.y"
+#line 974 "perly.y"
     { (yyval.opval) = newOP((ps[(1) - (3)].val.ival), 0);;}
     break;
 
   case 206:
-#line 972 "perly.y"
+#line 976 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 207:
-#line 974 "perly.y"
+#line 978 "perly.y"
     { (yyval.opval) = (ps[(1) - (3)].val.opval); ;}
     break;
 
   case 208:
-#line 976 "perly.y"
+#line 980 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); ;}
     break;
 
   case 209:
-#line 978 "perly.y"
+#line 982 "perly.y"
     { (yyval.opval) = ((ps[(1) - (3)].val.ival) == OP_NOT)
                           ? newUNOP((ps[(1) - (3)].val.ival), 0, newSVOP(OP_CONST, 0, newSViv(0)))
                           : newOP((ps[(1) - (3)].val.ival), OPf_SPECIAL); ;}
     break;
 
   case 210:
-#line 982 "perly.y"
+#line 986 "perly.y"
     { (yyval.opval) = newUNOP((ps[(1) - (4)].val.ival), 0, (ps[(3) - (4)].val.opval)); ;}
     break;
 
   case 211:
-#line 984 "perly.y"
+#line 988 "perly.y"
     {
                            if (   (ps[(1) - (1)].val.opval)->op_type != OP_TRANS
                                && (ps[(1) - (1)].val.opval)->op_type != OP_TRANSR
@@ -1344,12 +1348,12 @@ case 2:
     break;
 
   case 212:
-#line 995 "perly.y"
+#line 999 "perly.y"
     { (yyval.opval) = pmruntime((ps[(1) - (5)].val.opval), (ps[(4) - (5)].val.opval), 1, (ps[(2) - (5)].val.ival)); ;}
     break;
 
   case 215:
-#line 999 "perly.y"
+#line 1003 "perly.y"
     {
                          (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
                                newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
@@ -1357,136 +1361,136 @@ case 2:
     break;
 
   case 217:
-#line 1008 "perly.y"
+#line 1012 "perly.y"
     { (yyval.opval) = my_attrs((ps[(2) - (3)].val.opval),(ps[(3) - (3)].val.opval)); ;}
     break;
 
   case 218:
-#line 1010 "perly.y"
+#line 1014 "perly.y"
     { (yyval.opval) = localize((ps[(2) - (2)].val.opval),(ps[(1) - (2)].val.ival)); ;}
     break;
 
   case 219:
-#line 1015 "perly.y"
+#line 1019 "perly.y"
     { (yyval.opval) = sawparens((ps[(2) - (3)].val.opval)); ;}
     break;
 
   case 220:
-#line 1017 "perly.y"
+#line 1021 "perly.y"
     { (yyval.opval) = sawparens(newNULLLIST()); ;}
     break;
 
   case 221:
-#line 1020 "perly.y"
+#line 1024 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 222:
-#line 1022 "perly.y"
+#line 1026 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 223:
-#line 1024 "perly.y"
+#line 1028 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 224:
-#line 1029 "perly.y"
+#line 1033 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 225:
-#line 1031 "perly.y"
+#line 1035 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 226:
-#line 1035 "perly.y"
+#line 1039 "perly.y"
     { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 227:
-#line 1037 "perly.y"
+#line 1041 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 228:
-#line 1043 "perly.y"
+#line 1047 "perly.y"
     { parser->in_my = 0; (yyval.opval) = my((ps[(1) - (1)].val.opval)); ;}
     break;
 
   case 234:
-#line 1056 "perly.y"
+#line 1060 "perly.y"
     { (yyval.opval) = newCVREF((ps[(1) - (2)].val.ival),(ps[(2) - (2)].val.opval)); ;}
     break;
 
   case 235:
-#line 1060 "perly.y"
+#line 1064 "perly.y"
     { (yyval.opval) = newSVREF((ps[(2) - (2)].val.opval)); ;}
     break;
 
   case 236:
-#line 1064 "perly.y"
+#line 1068 "perly.y"
     { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval));
                          if ((yyval.opval)) (yyval.opval)->op_private |= (ps[(1) - (2)].val.ival);
                        ;}
     break;
 
   case 237:
-#line 1070 "perly.y"
+#line 1074 "perly.y"
     { (yyval.opval) = newHVREF((ps[(2) - (2)].val.opval));
                          if ((yyval.opval)) (yyval.opval)->op_private |= (ps[(1) - (2)].val.ival);
                        ;}
     break;
 
   case 238:
-#line 1076 "perly.y"
+#line 1080 "perly.y"
     { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval)); ;}
     break;
 
   case 239:
-#line 1078 "perly.y"
+#line 1082 "perly.y"
     { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval)); ;}
     break;
 
   case 240:
-#line 1082 "perly.y"
+#line 1086 "perly.y"
     { (yyval.opval) = newGVREF(0,(ps[(2) - (2)].val.opval)); ;}
     break;
 
   case 242:
-#line 1087 "perly.y"
+#line 1091 "perly.y"
     { (yyval.opval) = newAVREF((ps[(1) - (3)].val.opval)); ;}
     break;
 
   case 244:
-#line 1092 "perly.y"
+#line 1096 "perly.y"
     { (yyval.opval) = newHVREF((ps[(1) - (3)].val.opval)); ;}
     break;
 
   case 246:
-#line 1097 "perly.y"
+#line 1101 "perly.y"
     { (yyval.opval) = newGVREF(0,(ps[(1) - (3)].val.opval)); ;}
     break;
 
   case 247:
-#line 1102 "perly.y"
+#line 1106 "perly.y"
     { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); ;}
     break;
 
   case 248:
-#line 1104 "perly.y"
+#line 1108 "perly.y"
     { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); ;}
     break;
 
   case 249:
-#line 1106 "perly.y"
+#line 1110 "perly.y"
     { (yyval.opval) = op_scope((ps[(1) - (1)].val.opval)); ;}
     break;
 
   case 250:
-#line 1109 "perly.y"
+#line 1113 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
@@ -1497,6 +1501,6 @@ case 2:
     
 
 /* Generated from:
- * aa8cc2f0979e92f76ac0fbc21000e975a6a443beed009e907eddb57f3d8dbe6a perly.y
+ * 20fd9dcde08a4a26833ba7bf337260d78986b6542a0f55c00d7a9245af45faf5 perly.y
  * d1d4df7b8e30ac9dede664af9179e6e5e7ddc7f2ad9c4eff9e2e5b32c9e16a6e regen_perly.pl
  * ex: set ro: */
diff --git a/perly.h b/perly.h
index 0b7013c..a015b55 100644 (file)
--- a/perly.h
+++ b/perly.h
@@ -256,6 +256,6 @@ typedef union YYSTYPE
 
 
 /* Generated from:
- * aa8cc2f0979e92f76ac0fbc21000e975a6a443beed009e907eddb57f3d8dbe6a perly.y
+ * 20fd9dcde08a4a26833ba7bf337260d78986b6542a0f55c00d7a9245af45faf5 perly.y
  * d1d4df7b8e30ac9dede664af9179e6e5e7ddc7f2ad9c4eff9e2e5b32c9e16a6e regen_perly.pl
  * ex: set ro: */
index fededd1..0e3cc46 100644 (file)
--- a/perly.tab
+++ b/perly.tab
@@ -192,31 +192,31 @@ static const yytype_int16 yyrhs[] =
 static const yytype_uint16 yyrline[] =
 {
        0,   115,   115,   114,   125,   124,   134,   133,   146,   145,
-     158,   157,   170,   169,   181,   189,   197,   200,   208,   213,
-     214,   224,   225,   234,   238,   242,   246,   253,   255,   266,
-     265,   297,   305,   304,   312,   318,   324,   335,   337,   339,
-     346,   354,   356,   353,   372,   377,   384,   383,   398,   406,
-     412,   419,   418,   433,   437,   445,   463,   464,   469,   471,
-     473,   475,   477,   479,   481,   484,   490,   491,   496,   507,
-     508,   514,   520,   521,   526,   529,   533,   538,   542,   546,
-     550,   551,   555,   561,   566,   571,   572,   577,   578,   583,
-     584,   586,   591,   593,   598,   600,   599,   618,   628,   629,
-     633,   635,   637,   639,   643,   645,   650,   654,   658,   662,
-     668,   673,   679,   685,   687,   690,   689,   700,   701,   705,
-     709,   712,   717,   722,   725,   729,   733,   736,   741,   745,
-     748,   750,   752,   757,   759,   761,   766,   768,   770,   772,
-     774,   776,   778,   780,   782,   784,   786,   791,   793,   796,
-     798,   800,   803,   806,   817,   820,   827,   829,   831,   833,
-     835,   842,   844,   848,   849,   850,   851,   852,   854,   856,
-     858,   860,   862,   864,   866,   868,   870,   872,   874,   876,
-     878,   888,   898,   908,   918,   920,   922,   925,   930,   934,
-     936,   938,   940,   943,   945,   948,   950,   952,   954,   956,
-     958,   960,   962,   964,   967,   969,   971,   973,   975,   977,
-     981,   984,   983,   996,   997,   998,  1003,  1007,  1009,  1014,
-    1016,  1019,  1021,  1023,  1028,  1030,  1035,  1036,  1042,  1046,
-    1047,  1048,  1051,  1052,  1055,  1059,  1063,  1069,  1075,  1077,
-    1081,  1085,  1086,  1090,  1091,  1095,  1096,  1101,  1103,  1105,
-    1108
+     158,   157,   170,   169,   181,   189,   197,   201,   209,   215,
+     216,   226,   227,   236,   240,   244,   248,   255,   257,   268,
+     267,   300,   308,   307,   316,   322,   328,   339,   341,   343,
+     350,   358,   360,   357,   376,   381,   388,   387,   402,   410,
+     416,   423,   422,   437,   441,   449,   467,   468,   473,   475,
+     477,   479,   481,   483,   485,   488,   494,   495,   500,   511,
+     512,   518,   524,   525,   530,   533,   537,   542,   546,   550,
+     554,   555,   559,   565,   570,   575,   576,   581,   582,   587,
+     588,   590,   595,   597,   602,   604,   603,   622,   632,   633,
+     637,   639,   641,   643,   647,   649,   654,   658,   662,   666,
+     672,   677,   683,   689,   691,   694,   693,   704,   705,   709,
+     713,   716,   721,   726,   729,   733,   737,   740,   745,   749,
+     752,   754,   756,   761,   763,   765,   770,   772,   774,   776,
+     778,   780,   782,   784,   786,   788,   790,   795,   797,   800,
+     802,   804,   807,   810,   821,   824,   831,   833,   835,   837,
+     839,   846,   848,   852,   853,   854,   855,   856,   858,   860,
+     862,   864,   866,   868,   870,   872,   874,   876,   878,   880,
+     882,   892,   902,   912,   922,   924,   926,   929,   934,   938,
+     940,   942,   944,   947,   949,   952,   954,   956,   958,   960,
+     962,   964,   966,   968,   971,   973,   975,   977,   979,   981,
+     985,   988,   987,  1000,  1001,  1002,  1007,  1011,  1013,  1018,
+    1020,  1023,  1025,  1027,  1032,  1034,  1039,  1040,  1046,  1050,
+    1051,  1052,  1055,  1056,  1059,  1063,  1067,  1073,  1079,  1081,
+    1085,  1089,  1090,  1094,  1095,  1099,  1100,  1105,  1107,  1109,
+    1112
 };
 #endif
 
@@ -1140,6 +1140,6 @@ static const toketypes yy_type_tab[] =
 };
 
 /* Generated from:
- * aa8cc2f0979e92f76ac0fbc21000e975a6a443beed009e907eddb57f3d8dbe6a perly.y
+ * 20fd9dcde08a4a26833ba7bf337260d78986b6542a0f55c00d7a9245af45faf5 perly.y
  * d1d4df7b8e30ac9dede664af9179e6e5e7ddc7f2ad9c4eff9e2e5b32c9e16a6e regen_perly.pl
  * ex: set ro: */
diff --git a/perly.y b/perly.y
index 839575d..ece2904 100644 (file)
--- a/perly.y
+++ b/perly.y
@@ -194,7 +194,8 @@ formblock:  '=' remember ';' FORMRBRACK formstmtseq ';' '.'
        ;
 
 remember:      /* NULL */      /* start a full lexical scope */
-                       { $$ = block_start(TRUE); }
+                       { $$ = block_start(TRUE);
+                         parser->parsed_sub = 0; }
        ;
 
 mblock :       '{' mremember stmtseq '}'
@@ -205,7 +206,8 @@ mblock      :       '{' mremember stmtseq '}'
        ;
 
 mremember:     /* NULL */      /* start a partial lexical scope */
-                       { $$ = block_start(FALSE); }
+                       { $$ = block_start(FALSE);
+                         parser->parsed_sub = 0; }
        ;
 
 /* A sequence of statements in the program */
@@ -293,6 +295,7 @@ barestmt:   PLUGSTMT
                          ;
                          $$ = (OP*)NULL;
                          intro_my();
+                         parser->parsed_sub = 1;
                        }
        |       PACKAGE WORD WORD ';'
                        {
@@ -307,6 +310,7 @@ barestmt:   PLUGSTMT
                        {
                          SvREFCNT_inc_simple_void(PL_compcv);
                          utilize($1, $2, $4, $5, $6);
+                         parser->parsed_sub = 1;
                          $$ = (OP*)NULL;
                        }
        |       IF '(' remember mexpr ')' mblock else