parser: change LABEL type from pval to opval
authorDavid Mitchell <davem@iabyn.com>
Fri, 5 Apr 2019 11:49:50 +0000 (12:49 +0100)
committerDavid Mitchell <davem@iabyn.com>
Fri, 5 Apr 2019 13:02:09 +0000 (14:02 +0100)
The items pushed onto the parser stack can be one of several types:
ival, opval, pval etc. The only remaining use of pval is when a "label:"
is encountered.

When an error occurs during parsing, ops on the parse stack get
automatically reaped these days as part of the OP slab mechanism;
but bare strings (pvals) still leak.

Convert this one remaining pval into an opval, making the toker return
an OP_CONST with an SV holding the label.

Since newSTATEOP() still expects a raw string for the label, the parser
just grabs the value returned by the toker and makes a copy of the
string from it, then immediately frees the OP_CONST and its associated
SV.

The leak was showing up in ext/XS-APItest/t/stmtasexpr.t, which expects
to parse a statement where labels are banned.

perly.act
perly.h
perly.tab
perly.y
toke.c

index fe8a5e9..98e1572 100644 (file)
--- a/perly.act
+++ b/perly.act
@@ -5,7 +5,7 @@
  */
 
 case 2:
-#line 119 "perly.y" /* yacc.c:1646  */
+#line 119 "perly.y" /* yacc.c:1648  */
     {
                          parser->expect = XSTATE;
                           (yyval.ival) = 0;
@@ -14,7 +14,7 @@ case 2:
     break;
 
   case 3:
-#line 124 "perly.y" /* yacc.c:1646  */
+#line 124 "perly.y" /* yacc.c:1648  */
     {
                          newPROG(block_end((ps[-1].val.ival),(ps[0].val.opval)));
                          PL_compiling.cop_seq = 0;
@@ -24,7 +24,7 @@ case 2:
     break;
 
   case 4:
-#line 130 "perly.y" /* yacc.c:1646  */
+#line 130 "perly.y" /* yacc.c:1648  */
     {
                          parser->expect = XTERM;
                           (yyval.ival) = 0;
@@ -33,7 +33,7 @@ case 2:
     break;
 
   case 5:
-#line 135 "perly.y" /* yacc.c:1646  */
+#line 135 "perly.y" /* yacc.c:1648  */
     {
                          PL_eval_root = (ps[0].val.opval);
                          (yyval.ival) = 0;
@@ -42,7 +42,7 @@ case 2:
     break;
 
   case 6:
-#line 140 "perly.y" /* yacc.c:1646  */
+#line 140 "perly.y" /* yacc.c:1648  */
     {
                          parser->expect = XBLOCK;
                           (yyval.ival) = 0;
@@ -51,7 +51,7 @@ case 2:
     break;
 
   case 7:
-#line 145 "perly.y" /* yacc.c:1646  */
+#line 145 "perly.y" /* yacc.c:1648  */
     {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[0].val.opval);
@@ -63,7 +63,7 @@ case 2:
     break;
 
   case 8:
-#line 153 "perly.y" /* yacc.c:1646  */
+#line 153 "perly.y" /* yacc.c:1648  */
     {
                          parser->expect = XSTATE;
                           (yyval.ival) = 0;
@@ -72,7 +72,7 @@ case 2:
     break;
 
   case 9:
-#line 158 "perly.y" /* yacc.c:1646  */
+#line 158 "perly.y" /* yacc.c:1648  */
     {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[0].val.opval);
@@ -84,7 +84,7 @@ case 2:
     break;
 
   case 10:
-#line 166 "perly.y" /* yacc.c:1646  */
+#line 166 "perly.y" /* yacc.c:1648  */
     {
                          parser->expect = XSTATE;
                           (yyval.ival) = 0;
@@ -93,7 +93,7 @@ case 2:
     break;
 
   case 11:
-#line 171 "perly.y" /* yacc.c:1646  */
+#line 171 "perly.y" /* yacc.c:1648  */
     {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[0].val.opval);
@@ -105,7 +105,7 @@ case 2:
     break;
 
   case 12:
-#line 179 "perly.y" /* yacc.c:1646  */
+#line 179 "perly.y" /* yacc.c:1648  */
     {
                          parser->expect = XSTATE;
                           (yyval.ival) = 0;
@@ -114,7 +114,7 @@ case 2:
     break;
 
   case 13:
-#line 184 "perly.y" /* yacc.c:1646  */
+#line 184 "perly.y" /* yacc.c:1648  */
     {
                          PL_eval_root = (ps[0].val.opval);
                          (yyval.ival) = 0;
@@ -123,7 +123,7 @@ case 2:
     break;
 
   case 14:
-#line 192 "perly.y" /* yacc.c:1646  */
+#line 192 "perly.y" /* yacc.c:1648  */
     { if (parser->copline > (line_t)(ps[-3].val.ival))
                              parser->copline = (line_t)(ps[-3].val.ival);
                          (yyval.opval) = block_end((ps[-2].val.ival), (ps[-1].val.opval));
@@ -132,7 +132,7 @@ case 2:
     break;
 
   case 15:
-#line 200 "perly.y" /* yacc.c:1646  */
+#line 200 "perly.y" /* yacc.c:1648  */
     { if (parser->copline > (line_t)(ps[-6].val.ival))
                              parser->copline = (line_t)(ps[-6].val.ival);
                          (yyval.opval) = block_end((ps[-5].val.ival), (ps[-2].val.opval));
@@ -141,14 +141,14 @@ case 2:
     break;
 
   case 16:
-#line 207 "perly.y" /* yacc.c:1646  */
+#line 207 "perly.y" /* yacc.c:1648  */
     { (yyval.ival) = block_start(TRUE);
                          parser->parsed_sub = 0; }
 
     break;
 
   case 17:
-#line 212 "perly.y" /* yacc.c:1646  */
+#line 212 "perly.y" /* yacc.c:1648  */
     { if (parser->copline > (line_t)(ps[-3].val.ival))
                              parser->copline = (line_t)(ps[-3].val.ival);
                          (yyval.opval) = block_end((ps[-2].val.ival), (ps[-1].val.opval));
@@ -157,20 +157,20 @@ case 2:
     break;
 
   case 18:
-#line 219 "perly.y" /* yacc.c:1646  */
+#line 219 "perly.y" /* yacc.c:1648  */
     { (yyval.ival) = block_start(FALSE);
                          parser->parsed_sub = 0; }
 
     break;
 
   case 19:
-#line 225 "perly.y" /* yacc.c:1646  */
+#line 225 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 20:
-#line 227 "perly.y" /* yacc.c:1646  */
+#line 227 "perly.y" /* yacc.c:1648  */
     {   (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval));
                            PL_pad_reset_pending = TRUE;
                            if ((ps[-1].val.opval) && (ps[0].val.opval))
@@ -180,13 +180,13 @@ case 2:
     break;
 
   case 21:
-#line 236 "perly.y" /* yacc.c:1646  */
+#line 236 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 22:
-#line 238 "perly.y" /* yacc.c:1646  */
+#line 238 "perly.y" /* yacc.c:1648  */
     {   (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval));
                            PL_pad_reset_pending = TRUE;
                            if ((ps[-1].val.opval) && (ps[0].val.opval))
@@ -196,7 +196,7 @@ case 2:
     break;
 
   case 23:
-#line 247 "perly.y" /* yacc.c:1646  */
+#line 247 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = (ps[0].val.opval) ? newSTATEOP(0, NULL, (ps[0].val.opval)) : NULL;
                        }
@@ -204,35 +204,41 @@ case 2:
     break;
 
   case 24:
-#line 251 "perly.y" /* yacc.c:1646  */
+#line 251 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 25:
-#line 255 "perly.y" /* yacc.c:1646  */
+#line 255 "perly.y" /* yacc.c:1648  */
     {
-                         (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[-1].val.pval)[strlen((ps[-1].val.pval))+1], (ps[-1].val.pval), (ps[0].val.opval));
+                          SV *label = cSVOPx_sv((ps[-1].val.opval));
+                         (yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8,
+                                            savepv(SvPVX_const(label)), (ps[0].val.opval));
+                          op_free((ps[-1].val.opval));
                        }
 
     break;
 
   case 26:
-#line 259 "perly.y" /* yacc.c:1646  */
+#line 262 "perly.y" /* yacc.c:1648  */
     {
-                         (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[-1].val.pval)[strlen((ps[-1].val.pval))+1], (ps[-1].val.pval), (ps[0].val.opval));
+                          SV *label = cSVOPx_sv((ps[-1].val.opval));
+                         (yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8,
+                                            savepv(SvPVX_const(label)), (ps[0].val.opval));
+                          op_free((ps[-1].val.opval));
                        }
 
     break;
 
   case 27:
-#line 266 "perly.y" /* yacc.c:1646  */
+#line 272 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 28:
-#line 268 "perly.y" /* yacc.c:1646  */
+#line 274 "perly.y" /* yacc.c:1648  */
     {
                          CV *fmtcv = PL_compcv;
                          newFORM((ps[-2].val.ival), (ps[-1].val.opval), (ps[0].val.opval));
@@ -246,7 +252,7 @@ case 2:
     break;
 
   case 29:
-#line 280 "perly.y" /* yacc.c:1646  */
+#line 286 "perly.y" /* yacc.c:1648  */
     {
                           init_named_cv(PL_compcv, (ps[-1].val.opval));
                          parser->in_my = 0;
@@ -256,7 +262,7 @@ case 2:
     break;
 
   case 30:
-#line 286 "perly.y" /* yacc.c:1646  */
+#line 292 "perly.y" /* yacc.c:1648  */
     {
                          SvREFCNT_inc_simple_void(PL_compcv);
                          (ps[-5].val.opval)->op_type == OP_CONST
@@ -271,7 +277,7 @@ case 2:
     break;
 
   case 31:
-#line 301 "perly.y" /* yacc.c:1646  */
+#line 307 "perly.y" /* yacc.c:1648  */
     {
                           init_named_cv(PL_compcv, (ps[-1].val.opval));
                          parser->in_my = 0;
@@ -281,7 +287,7 @@ case 2:
     break;
 
   case 32:
-#line 307 "perly.y" /* yacc.c:1646  */
+#line 313 "perly.y" /* yacc.c:1648  */
     {
                          SvREFCNT_inc_simple_void(PL_compcv);
                          (ps[-4].val.opval)->op_type == OP_CONST
@@ -296,7 +302,7 @@ case 2:
     break;
 
   case 33:
-#line 318 "perly.y" /* yacc.c:1646  */
+#line 324 "perly.y" /* yacc.c:1648  */
     {
                          package((ps[-1].val.opval));
                          if ((ps[-2].val.opval))
@@ -307,13 +313,13 @@ case 2:
     break;
 
   case 34:
-#line 325 "perly.y" /* yacc.c:1646  */
+#line 331 "perly.y" /* yacc.c:1648  */
     { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
 
     break;
 
   case 35:
-#line 327 "perly.y" /* yacc.c:1646  */
+#line 333 "perly.y" /* yacc.c:1648  */
     {
                          SvREFCNT_inc_simple_void(PL_compcv);
                          utilize((ps[-6].val.ival), (ps[-5].val.ival), (ps[-3].val.opval), (ps[-2].val.opval), (ps[-1].val.opval));
@@ -324,7 +330,7 @@ case 2:
     break;
 
   case 36:
-#line 334 "perly.y" /* yacc.c:1646  */
+#line 340 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = block_end((ps[-4].val.ival),
                              newCONDOP(0, (ps[-3].val.opval), op_scope((ps[-1].val.opval)), (ps[0].val.opval)));
@@ -334,7 +340,7 @@ case 2:
     break;
 
   case 37:
-#line 340 "perly.y" /* yacc.c:1646  */
+#line 346 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = block_end((ps[-4].val.ival),
                               newCONDOP(0, (ps[-3].val.opval), (ps[0].val.opval), op_scope((ps[-1].val.opval))));
@@ -344,7 +350,7 @@ case 2:
     break;
 
   case 38:
-#line 346 "perly.y" /* yacc.c:1646  */
+#line 352 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = block_end((ps[-3].val.ival), newGIVENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)), 0));
                          parser->copline = (line_t)(ps[-5].val.ival);
@@ -353,19 +359,19 @@ case 2:
     break;
 
   case 39:
-#line 351 "perly.y" /* yacc.c:1646  */
+#line 357 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = block_end((ps[-3].val.ival), newWHENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)))); }
 
     break;
 
   case 40:
-#line 353 "perly.y" /* yacc.c:1646  */
+#line 359 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newWHENOP(0, op_scope((ps[0].val.opval))); }
 
     break;
 
   case 41:
-#line 355 "perly.y" /* yacc.c:1646  */
+#line 361 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = block_end((ps[-5].val.ival),
                                  newWHILEOP(0, 1, NULL,
@@ -376,7 +382,7 @@ case 2:
     break;
 
   case 42:
-#line 362 "perly.y" /* yacc.c:1646  */
+#line 368 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = block_end((ps[-5].val.ival),
                                  newWHILEOP(0, 1, NULL,
@@ -387,19 +393,19 @@ case 2:
     break;
 
   case 43:
-#line 369 "perly.y" /* yacc.c:1646  */
+#line 375 "perly.y" /* yacc.c:1648  */
     { parser->expect = XTERM; }
 
     break;
 
   case 44:
-#line 371 "perly.y" /* yacc.c:1646  */
+#line 377 "perly.y" /* yacc.c:1648  */
     { parser->expect = XTERM; }
 
     break;
 
   case 45:
-#line 374 "perly.y" /* yacc.c:1646  */
+#line 380 "perly.y" /* yacc.c:1648  */
     {
                          OP *initop = (ps[-9].val.opval);
                          OP *forop = newWHILEOP(0, 1, NULL,
@@ -418,7 +424,7 @@ case 2:
     break;
 
   case 46:
-#line 389 "perly.y" /* yacc.c:1646  */
+#line 395 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = block_end((ps[-6].val.ival), newFOROP(0, (ps[-5].val.opval), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
                          parser->copline = (line_t)(ps[-8].val.ival);
@@ -427,7 +433,7 @@ case 2:
     break;
 
   case 47:
-#line 394 "perly.y" /* yacc.c:1646  */
+#line 400 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = block_end((ps[-4].val.ival), newFOROP(0,
                                      op_lvalue((ps[-6].val.opval), OP_ENTERLOOP), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
@@ -437,13 +443,13 @@ case 2:
     break;
 
   case 48:
-#line 400 "perly.y" /* yacc.c:1646  */
+#line 406 "perly.y" /* yacc.c:1648  */
     { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); }
 
     break;
 
   case 49:
-#line 402 "perly.y" /* yacc.c:1646  */
+#line 408 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = block_end(
                                (ps[-7].val.ival),
@@ -460,7 +466,7 @@ case 2:
     break;
 
   case 50:
-#line 415 "perly.y" /* yacc.c:1646  */
+#line 421 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = block_end((ps[-4].val.ival), newFOROP(
                                0, op_lvalue(newUNOP(OP_REFGEN, 0,
@@ -472,7 +478,7 @@ case 2:
     break;
 
   case 51:
-#line 423 "perly.y" /* yacc.c:1646  */
+#line 429 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = block_end((ps[-4].val.ival),
                                  newFOROP(0, NULL, (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
@@ -482,7 +488,7 @@ case 2:
     break;
 
   case 52:
-#line 429 "perly.y" /* yacc.c:1646  */
+#line 435 "perly.y" /* yacc.c:1648  */
     {
                          /* a block is a loop that happens once */
                          (yyval.opval) = newWHILEOP(0, 1, NULL,
@@ -492,7 +498,7 @@ case 2:
     break;
 
   case 53:
-#line 435 "perly.y" /* yacc.c:1646  */
+#line 441 "perly.y" /* yacc.c:1648  */
     {
                          package((ps[-2].val.opval));
                          if ((ps[-3].val.opval)) {
@@ -503,7 +509,7 @@ case 2:
     break;
 
   case 54:
-#line 442 "perly.y" /* yacc.c:1646  */
+#line 448 "perly.y" /* yacc.c:1648  */
     {
                          /* a block is a loop that happens once */
                          (yyval.opval) = newWHILEOP(0, 1, NULL,
@@ -515,7 +521,7 @@ case 2:
     break;
 
   case 55:
-#line 450 "perly.y" /* yacc.c:1646  */
+#line 456 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = (ps[-1].val.opval);
                        }
@@ -523,7 +529,7 @@ case 2:
     break;
 
   case 56:
-#line 454 "perly.y" /* yacc.c:1646  */
+#line 460 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
                                newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
@@ -532,7 +538,7 @@ case 2:
     break;
 
   case 57:
-#line 459 "perly.y" /* yacc.c:1646  */
+#line 465 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = NULL;
                          parser->copline = NOLINE;
@@ -541,7 +547,7 @@ case 2:
     break;
 
   case 58:
-#line 467 "perly.y" /* yacc.c:1646  */
+#line 473 "perly.y" /* yacc.c:1648  */
     { OP *list;
                          if ((ps[0].val.opval)) {
                              OP *term = (ps[0].val.opval);
@@ -560,74 +566,74 @@ case 2:
     break;
 
   case 59:
-#line 484 "perly.y" /* yacc.c:1646  */
+#line 490 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 60:
-#line 486 "perly.y" /* yacc.c:1646  */
+#line 492 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_unscope((ps[-1].val.opval)); }
 
     break;
 
   case 61:
-#line 491 "perly.y" /* yacc.c:1646  */
+#line 497 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 62:
-#line 493 "perly.y" /* yacc.c:1646  */
+#line 499 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 63:
-#line 495 "perly.y" /* yacc.c:1646  */
+#line 501 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[0].val.opval), (ps[-2].val.opval)); }
 
     break;
 
   case 64:
-#line 497 "perly.y" /* yacc.c:1646  */
+#line 503 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[0].val.opval), (ps[-2].val.opval)); }
 
     break;
 
   case 65:
-#line 499 "perly.y" /* yacc.c:1646  */
+#line 505 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[0].val.opval)), (ps[-2].val.opval)); }
 
     break;
 
   case 66:
-#line 501 "perly.y" /* yacc.c:1646  */
+#line 507 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[0].val.opval), (ps[-2].val.opval)); }
 
     break;
 
   case 67:
-#line 503 "perly.y" /* yacc.c:1646  */
+#line 509 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newFOROP(0, NULL, (ps[0].val.opval), (ps[-2].val.opval), NULL);
                          parser->copline = (line_t)(ps[-1].val.ival); }
 
     break;
 
   case 68:
-#line 506 "perly.y" /* yacc.c:1646  */
+#line 512 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newWHENOP((ps[0].val.opval), op_scope((ps[-2].val.opval))); }
 
     break;
 
   case 69:
-#line 511 "perly.y" /* yacc.c:1646  */
+#line 517 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 70:
-#line 513 "perly.y" /* yacc.c:1646  */
+#line 519 "perly.y" /* yacc.c:1648  */
     {
                          ((ps[0].val.opval))->op_flags |= OPf_PARENS;
                          (yyval.opval) = op_scope((ps[0].val.opval));
@@ -636,7 +642,7 @@ case 2:
     break;
 
   case 71:
-#line 518 "perly.y" /* yacc.c:1646  */
+#line 524 "perly.y" /* yacc.c:1648  */
     { parser->copline = (line_t)(ps[-5].val.ival);
                            (yyval.opval) = newCONDOP(0,
                                newSTATEOP(OPf_SPECIAL,NULL,(ps[-3].val.opval)),
@@ -647,19 +653,19 @@ case 2:
     break;
 
   case 72:
-#line 528 "perly.y" /* yacc.c:1646  */
+#line 534 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 73:
-#line 530 "perly.y" /* yacc.c:1646  */
+#line 536 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_scope((ps[0].val.opval)); }
 
     break;
 
   case 74:
-#line 535 "perly.y" /* yacc.c:1646  */
+#line 541 "perly.y" /* yacc.c:1648  */
     { (yyval.ival) = (PL_min_intro_pending &&
                            PL_max_intro_pending >=  PL_min_intro_pending);
                          intro_my(); }
@@ -667,13 +673,13 @@ case 2:
     break;
 
   case 75:
-#line 541 "perly.y" /* yacc.c:1646  */
+#line 547 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 77:
-#line 547 "perly.y" /* yacc.c:1646  */
+#line 553 "perly.y" /* yacc.c:1648  */
     { YYSTYPE tmplval;
                          (void)scan_num("1", &tmplval);
                          (yyval.opval) = tmplval.opval; }
@@ -681,118 +687,118 @@ case 2:
     break;
 
   case 79:
-#line 555 "perly.y" /* yacc.c:1646  */
+#line 561 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = invert(scalar((ps[0].val.opval))); }
 
     break;
 
   case 80:
-#line 560 "perly.y" /* yacc.c:1646  */
+#line 566 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); intro_my(); }
 
     break;
 
   case 81:
-#line 564 "perly.y" /* yacc.c:1646  */
+#line 570 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); intro_my(); }
 
     break;
 
   case 82:
-#line 567 "perly.y" /* yacc.c:1646  */
+#line 573 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 83:
-#line 568 "perly.y" /* yacc.c:1646  */
+#line 574 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 84:
-#line 572 "perly.y" /* yacc.c:1646  */
+#line 578 "perly.y" /* yacc.c:1648  */
     { (yyval.ival) = start_subparse(FALSE, 0);
                            SAVEFREESV(PL_compcv); }
 
     break;
 
   case 85:
-#line 578 "perly.y" /* yacc.c:1646  */
+#line 584 "perly.y" /* yacc.c:1648  */
     { (yyval.ival) = start_subparse(FALSE, CVf_ANON);
                            SAVEFREESV(PL_compcv); }
 
     break;
 
   case 86:
-#line 583 "perly.y" /* yacc.c:1646  */
+#line 589 "perly.y" /* yacc.c:1648  */
     { (yyval.ival) = start_subparse(TRUE, 0);
                            SAVEFREESV(PL_compcv); }
 
     break;
 
   case 89:
-#line 594 "perly.y" /* yacc.c:1646  */
+#line 600 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 91:
-#line 600 "perly.y" /* yacc.c:1646  */
+#line 606 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 92:
-#line 602 "perly.y" /* yacc.c:1646  */
+#line 608 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 93:
-#line 604 "perly.y" /* yacc.c:1646  */
+#line 610 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 94:
-#line 609 "perly.y" /* yacc.c:1646  */
+#line 615 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 95:
-#line 611 "perly.y" /* yacc.c:1646  */
+#line 617 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 96:
-#line 622 "perly.y" /* yacc.c:1646  */
+#line 628 "perly.y" /* yacc.c:1648  */
     { parser->in_my = 0; (yyval.opval) = NULL; }
 
     break;
 
   case 97:
-#line 624 "perly.y" /* yacc.c:1646  */
+#line 630 "perly.y" /* yacc.c:1648  */
     { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 98:
-#line 629 "perly.y" /* yacc.c:1646  */
+#line 635 "perly.y" /* yacc.c:1648  */
     { (yyval.ival) = '@'; }
 
     break;
 
   case 99:
-#line 631 "perly.y" /* yacc.c:1646  */
+#line 637 "perly.y" /* yacc.c:1648  */
     { (yyval.ival) = '%'; }
 
     break;
 
   case 100:
-#line 635 "perly.y" /* yacc.c:1646  */
+#line 641 "perly.y" /* yacc.c:1648  */
     {
                             I32 sigil   = (ps[-2].val.ival);
                             OP *var     = (ps[-1].val.opval);
@@ -812,25 +818,25 @@ case 2:
     break;
 
   case 101:
-#line 654 "perly.y" /* yacc.c:1646  */
+#line 660 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 102:
-#line 656 "perly.y" /* yacc.c:1646  */
+#line 662 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newOP(OP_NULL, 0); }
 
     break;
 
   case 103:
-#line 658 "perly.y" /* yacc.c:1646  */
+#line 664 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 104:
-#line 664 "perly.y" /* yacc.c:1646  */
+#line 670 "perly.y" /* yacc.c:1648  */
     {
                             OP *var     = (ps[-1].val.opval);
                             OP *defexpr = (ps[0].val.opval);
@@ -895,25 +901,25 @@ case 2:
     break;
 
   case 105:
-#line 729 "perly.y" /* yacc.c:1646  */
+#line 735 "perly.y" /* yacc.c:1648  */
     { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 106:
-#line 731 "perly.y" /* yacc.c:1646  */
+#line 737 "perly.y" /* yacc.c:1648  */
     { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 107:
-#line 737 "perly.y" /* yacc.c:1646  */
+#line 743 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[-1].val.opval); }
 
     break;
 
   case 108:
-#line 739 "perly.y" /* yacc.c:1646  */
+#line 745 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-2].val.opval), (ps[0].val.opval));
                        }
@@ -921,37 +927,37 @@ case 2:
     break;
 
   case 109:
-#line 743 "perly.y" /* yacc.c:1646  */
+#line 749 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 110:
-#line 748 "perly.y" /* yacc.c:1646  */
+#line 754 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 111:
-#line 750 "perly.y" /* yacc.c:1646  */
+#line 756 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 112:
-#line 754 "perly.y" /* yacc.c:1646  */
+#line 760 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 113:
-#line 756 "perly.y" /* yacc.c:1646  */
+#line 762 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 114:
-#line 760 "perly.y" /* yacc.c:1646  */
+#line 766 "perly.y" /* yacc.c:1648  */
     {
                             ENTER;
                             SAVEIV(parser->sig_elems);
@@ -966,7 +972,7 @@ case 2:
     break;
 
   case 115:
-#line 772 "perly.y" /* yacc.c:1646  */
+#line 778 "perly.y" /* yacc.c:1648  */
     {
                             OP            *sigops = (ps[-1].val.opval);
                             UNOP_AUX_item *aux;
@@ -1014,19 +1020,19 @@ case 2:
     break;
 
   case 116:
-#line 818 "perly.y" /* yacc.c:1646  */
+#line 824 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 117:
-#line 819 "perly.y" /* yacc.c:1646  */
+#line 825 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 118:
-#line 825 "perly.y" /* yacc.c:1646  */
+#line 831 "perly.y" /* yacc.c:1648  */
     {
                          if (parser->copline > (line_t)(ps[-2].val.ival))
                              parser->copline = (line_t)(ps[-2].val.ival);
@@ -1036,19 +1042,19 @@ case 2:
     break;
 
   case 119:
-#line 835 "perly.y" /* yacc.c:1646  */
+#line 841 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 120:
-#line 836 "perly.y" /* yacc.c:1646  */
+#line 842 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 121:
-#line 840 "perly.y" /* yacc.c:1646  */
+#line 846 "perly.y" /* yacc.c:1648  */
     {
                          if (parser->copline > (line_t)(ps[-2].val.ival))
                              parser->copline = (line_t)(ps[-2].val.ival);
@@ -1059,31 +1065,31 @@ case 2:
     break;
 
   case 122:
-#line 851 "perly.y" /* yacc.c:1646  */
+#line 857 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 123:
-#line 853 "perly.y" /* yacc.c:1646  */
+#line 859 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 124:
-#line 855 "perly.y" /* yacc.c:1646  */
+#line 861 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 126:
-#line 861 "perly.y" /* yacc.c:1646  */
+#line 867 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[-1].val.opval); }
 
     break;
 
   case 127:
-#line 863 "perly.y" /* yacc.c:1646  */
+#line 869 "perly.y" /* yacc.c:1648  */
     {
                          OP* term = (ps[0].val.opval);
                          (yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), term);
@@ -1092,7 +1098,7 @@ case 2:
     break;
 
   case 129:
-#line 872 "perly.y" /* yacc.c:1646  */
+#line 878 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_convert_list((ps[-2].val.ival), OPf_STACKED,
                                op_prepend_elem(OP_LIST, newGVREF((ps[-2].val.ival),(ps[-1].val.opval)), (ps[0].val.opval)) );
                        }
@@ -1100,7 +1106,7 @@ case 2:
     break;
 
   case 130:
-#line 876 "perly.y" /* yacc.c:1646  */
+#line 882 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_convert_list((ps[-4].val.ival), OPf_STACKED,
                                op_prepend_elem(OP_LIST, newGVREF((ps[-4].val.ival),(ps[-2].val.opval)), (ps[-1].val.opval)) );
                        }
@@ -1108,7 +1114,7 @@ case 2:
     break;
 
   case 131:
-#line 880 "perly.y" /* yacc.c:1646  */
+#line 886 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, scalar((ps[-5].val.opval)), (ps[-1].val.opval)),
@@ -1118,7 +1124,7 @@ case 2:
     break;
 
   case 132:
-#line 886 "perly.y" /* yacc.c:1646  */
+#line 892 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, scalar((ps[-2].val.opval)),
                                    newMETHOP(OP_METHOD, 0, (ps[0].val.opval))));
@@ -1127,7 +1133,7 @@ case 2:
     break;
 
   case 133:
-#line 891 "perly.y" /* yacc.c:1646  */
+#line 897 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, (ps[-1].val.opval), (ps[0].val.opval)),
@@ -1137,7 +1143,7 @@ case 2:
     break;
 
   case 134:
-#line 897 "perly.y" /* yacc.c:1646  */
+#line 903 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, (ps[-3].val.opval), (ps[-1].val.opval)),
@@ -1147,26 +1153,26 @@ case 2:
     break;
 
   case 135:
-#line 903 "perly.y" /* yacc.c:1646  */
+#line 909 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_convert_list((ps[-1].val.ival), 0, (ps[0].val.opval)); }
 
     break;
 
   case 136:
-#line 905 "perly.y" /* yacc.c:1646  */
+#line 911 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
 
     break;
 
   case 137:
-#line 907 "perly.y" /* yacc.c:1646  */
+#line 913 "perly.y" /* yacc.c:1648  */
     { SvREFCNT_inc_simple_void(PL_compcv);
                          (yyval.opval) = newANONATTRSUB((ps[-1].val.ival), 0, NULL, (ps[0].val.opval)); }
 
     break;
 
   case 138:
-#line 910 "perly.y" /* yacc.c:1646  */
+#line 916 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                 op_append_elem(OP_LIST,
                                   op_prepend_elem(OP_LIST, (ps[-1].val.opval), (ps[0].val.opval)), (ps[-4].val.opval)));
@@ -1175,20 +1181,20 @@ case 2:
     break;
 
   case 141:
-#line 925 "perly.y" /* yacc.c:1646  */
+#line 931 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[-4].val.opval), scalar((ps[-2].val.opval))); }
 
     break;
 
   case 142:
-#line 927 "perly.y" /* yacc.c:1646  */
+#line 933 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[-3].val.opval)), scalar((ps[-1].val.opval)));
                        }
 
     break;
 
   case 143:
-#line 930 "perly.y" /* yacc.c:1646  */
+#line 936 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[-4].val.opval)),OP_RV2AV),
                                        scalar((ps[-1].val.opval)));
@@ -1197,7 +1203,7 @@ case 2:
     break;
 
   case 144:
-#line 935 "perly.y" /* yacc.c:1646  */
+#line 941 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[-3].val.opval)),OP_RV2AV),
                                        scalar((ps[-1].val.opval)));
@@ -1206,14 +1212,14 @@ case 2:
     break;
 
   case 145:
-#line 940 "perly.y" /* yacc.c:1646  */
+#line 946 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[-4].val.opval)), jmaybe((ps[-2].val.opval)));
                        }
 
     break;
 
   case 146:
-#line 943 "perly.y" /* yacc.c:1646  */
+#line 949 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[-5].val.opval)),OP_RV2HV),
                                        jmaybe((ps[-2].val.opval))); }
@@ -1221,7 +1227,7 @@ case 2:
     break;
 
   case 147:
-#line 947 "perly.y" /* yacc.c:1646  */
+#line 953 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[-4].val.opval)),OP_RV2HV),
                                        jmaybe((ps[-2].val.opval))); }
@@ -1229,7 +1235,7 @@ case 2:
     break;
 
   case 148:
-#line 951 "perly.y" /* yacc.c:1646  */
+#line 957 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar((ps[-3].val.opval))));
                          if (parser->expect == XBLOCK)
@@ -1239,7 +1245,7 @@ case 2:
     break;
 
   case 149:
-#line 957 "perly.y" /* yacc.c:1646  */
+#line 963 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   op_append_elem(OP_LIST, (ps[-1].val.opval),
                                       newCVREF(0, scalar((ps[-4].val.opval)))));
@@ -1250,7 +1256,7 @@ case 2:
     break;
 
   case 150:
-#line 965 "perly.y" /* yacc.c:1646  */
+#line 971 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   op_append_elem(OP_LIST, (ps[-1].val.opval),
                                               newCVREF(0, scalar((ps[-3].val.opval)))));
@@ -1261,7 +1267,7 @@ case 2:
     break;
 
   case 151:
-#line 972 "perly.y" /* yacc.c:1646  */
+#line 978 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar((ps[-2].val.opval))));
                          if (parser->expect == XBLOCK)
@@ -1271,37 +1277,37 @@ case 2:
     break;
 
   case 152:
-#line 978 "perly.y" /* yacc.c:1646  */
+#line 984 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-4].val.opval)); }
 
     break;
 
   case 153:
-#line 980 "perly.y" /* yacc.c:1646  */
+#line 986 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-3].val.opval)); }
 
     break;
 
   case 154:
-#line 982 "perly.y" /* yacc.c:1646  */
+#line 988 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), NULL); }
 
     break;
 
   case 155:
-#line 987 "perly.y" /* yacc.c:1646  */
+#line 993 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[-2].val.opval), (ps[-1].val.ival), (ps[0].val.opval)); }
 
     break;
 
   case 156:
-#line 989 "perly.y" /* yacc.c:1646  */
+#line 995 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 157:
-#line 991 "perly.y" /* yacc.c:1646  */
+#line 997 "perly.y" /* yacc.c:1648  */
     {   if ((ps[-1].val.ival) != OP_REPEAT)
                                scalar((ps[-2].val.opval));
                            (yyval.opval) = newBINOP((ps[-1].val.ival), 0, (ps[-2].val.opval), scalar((ps[0].val.opval)));
@@ -1310,111 +1316,111 @@ case 2:
     break;
 
   case 158:
-#line 996 "perly.y" /* yacc.c:1646  */
+#line 1002 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 159:
-#line 998 "perly.y" /* yacc.c:1646  */
+#line 1004 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 160:
-#line 1000 "perly.y" /* yacc.c:1646  */
+#line 1006 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 161:
-#line 1002 "perly.y" /* yacc.c:1646  */
+#line 1008 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 162:
-#line 1004 "perly.y" /* yacc.c:1646  */
+#line 1010 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 163:
-#line 1006 "perly.y" /* yacc.c:1646  */
+#line 1012 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 164:
-#line 1008 "perly.y" /* yacc.c:1646  */
+#line 1014 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newRANGE((ps[-1].val.ival), scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
   case 165:
-#line 1010 "perly.y" /* yacc.c:1646  */
+#line 1016 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 166:
-#line 1012 "perly.y" /* yacc.c:1646  */
+#line 1018 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 167:
-#line 1014 "perly.y" /* yacc.c:1646  */
+#line 1020 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 168:
-#line 1016 "perly.y" /* yacc.c:1646  */
+#line 1022 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = bind_match((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 169:
-#line 1021 "perly.y" /* yacc.c:1646  */
+#line 1027 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[0].val.opval))); }
 
     break;
 
   case 170:
-#line 1023 "perly.y" /* yacc.c:1646  */
+#line 1029 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 171:
-#line 1026 "perly.y" /* yacc.c:1646  */
+#line 1032 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
 
     break;
 
   case 172:
-#line 1028 "perly.y" /* yacc.c:1646  */
+#line 1034 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, scalar((ps[0].val.opval))); }
 
     break;
 
   case 173:
-#line 1030 "perly.y" /* yacc.c:1646  */
+#line 1036 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_POSTINC, 0,
                                        op_lvalue(scalar((ps[-1].val.opval)), OP_POSTINC)); }
 
     break;
 
   case 174:
-#line 1033 "perly.y" /* yacc.c:1646  */
+#line 1039 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_POSTDEC, 0,
                                        op_lvalue(scalar((ps[-1].val.opval)), OP_POSTDEC));}
 
     break;
 
   case 175:
-#line 1036 "perly.y" /* yacc.c:1646  */
+#line 1042 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_convert_list(OP_JOIN, 0,
                                       op_append_elem(
                                        OP_LIST,
@@ -1429,155 +1435,155 @@ case 2:
     break;
 
   case 176:
-#line 1047 "perly.y" /* yacc.c:1646  */
+#line 1053 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_PREINC, 0,
                                        op_lvalue(scalar((ps[0].val.opval)), OP_PREINC)); }
 
     break;
 
   case 177:
-#line 1050 "perly.y" /* yacc.c:1646  */
+#line 1056 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_PREDEC, 0,
                                        op_lvalue(scalar((ps[0].val.opval)), OP_PREDEC)); }
 
     break;
 
   case 178:
-#line 1057 "perly.y" /* yacc.c:1646  */
+#line 1063 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newANONLIST((ps[-1].val.opval)); }
 
     break;
 
   case 179:
-#line 1059 "perly.y" /* yacc.c:1646  */
+#line 1065 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newANONLIST(NULL);}
 
     break;
 
   case 180:
-#line 1061 "perly.y" /* yacc.c:1646  */
+#line 1067 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newANONHASH((ps[-2].val.opval)); }
 
     break;
 
   case 181:
-#line 1063 "perly.y" /* yacc.c:1646  */
+#line 1069 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newANONHASH(NULL); }
 
     break;
 
   case 182:
-#line 1065 "perly.y" /* yacc.c:1646  */
+#line 1071 "perly.y" /* yacc.c:1648  */
     { SvREFCNT_inc_simple_void(PL_compcv);
                          (yyval.opval) = newANONATTRSUB((ps[-3].val.ival), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 183:
-#line 1068 "perly.y" /* yacc.c:1646  */
+#line 1074 "perly.y" /* yacc.c:1648  */
     { SvREFCNT_inc_simple_void(PL_compcv);
                          (yyval.opval) = newANONATTRSUB((ps[-2].val.ival), NULL, (ps[-1].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 184:
-#line 1074 "perly.y" /* yacc.c:1646  */
+#line 1080 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = dofile((ps[0].val.opval), (ps[-1].val.ival));}
 
     break;
 
   case 185:
-#line 1076 "perly.y" /* yacc.c:1646  */
+#line 1082 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[0].val.opval)));}
 
     break;
 
   case 190:
-#line 1084 "perly.y" /* yacc.c:1646  */
+#line 1090 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newCONDOP(0, (ps[-4].val.opval), (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
   case 191:
-#line 1086 "perly.y" /* yacc.c:1646  */
+#line 1092 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[0].val.opval)); }
 
     break;
 
   case 192:
-#line 1088 "perly.y" /* yacc.c:1646  */
+#line 1094 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, localize((ps[0].val.opval),1)); }
 
     break;
 
   case 193:
-#line 1090 "perly.y" /* yacc.c:1646  */
+#line 1096 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 194:
-#line 1092 "perly.y" /* yacc.c:1646  */
+#line 1098 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = localize((ps[0].val.opval),0); }
 
     break;
 
   case 195:
-#line 1094 "perly.y" /* yacc.c:1646  */
+#line 1100 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = sawparens((ps[-1].val.opval)); }
 
     break;
 
   case 196:
-#line 1096 "perly.y" /* yacc.c:1646  */
+#line 1102 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 197:
-#line 1098 "perly.y" /* yacc.c:1646  */
+#line 1104 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = sawparens(newNULLLIST()); }
 
     break;
 
   case 198:
-#line 1100 "perly.y" /* yacc.c:1646  */
+#line 1106 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 199:
-#line 1102 "perly.y" /* yacc.c:1646  */
+#line 1108 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 200:
-#line 1104 "perly.y" /* yacc.c:1646  */
+#line 1110 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 201:
-#line 1106 "perly.y" /* yacc.c:1646  */
+#line 1112 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 202:
-#line 1108 "perly.y" /* yacc.c:1646  */
+#line 1114 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[0].val.opval), OP_AV2ARYLEN));}
 
     break;
 
   case 203:
-#line 1110 "perly.y" /* yacc.c:1646  */
+#line 1116 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 204:
-#line 1112 "perly.y" /* yacc.c:1646  */
+#line 1118 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_prepend_elem(OP_ASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_ASLICE, 0,
@@ -1591,7 +1597,7 @@ case 2:
     break;
 
   case 205:
-#line 1122 "perly.y" /* yacc.c:1646  */
+#line 1128 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_prepend_elem(OP_KVASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_KVASLICE, 0,
@@ -1605,7 +1611,7 @@ case 2:
     break;
 
   case 206:
-#line 1132 "perly.y" /* yacc.c:1646  */
+#line 1138 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_prepend_elem(OP_HSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_HSLICE, 0,
@@ -1619,7 +1625,7 @@ case 2:
     break;
 
   case 207:
-#line 1142 "perly.y" /* yacc.c:1646  */
+#line 1148 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_prepend_elem(OP_KVHSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_KVHSLICE, 0,
@@ -1633,26 +1639,26 @@ case 2:
     break;
 
   case 208:
-#line 1152 "perly.y" /* yacc.c:1646  */
+#line 1158 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 209:
-#line 1154 "perly.y" /* yacc.c:1646  */
+#line 1160 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[0].val.opval))); }
 
     break;
 
   case 210:
-#line 1156 "perly.y" /* yacc.c:1646  */
+#line 1162 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[-2].val.opval)));
                        }
 
     break;
 
   case 211:
-#line 1159 "perly.y" /* yacc.c:1646  */
+#line 1165 "perly.y" /* yacc.c:1648  */
     {
                          (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, (ps[-1].val.opval), scalar((ps[-3].val.opval))));
@@ -1661,7 +1667,7 @@ case 2:
     break;
 
   case 212:
-#line 1164 "perly.y" /* yacc.c:1646  */
+#line 1170 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval))));
                        }
@@ -1669,130 +1675,130 @@ case 2:
     break;
 
   case 213:
-#line 1168 "perly.y" /* yacc.c:1646  */
+#line 1174 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newSVREF((ps[-3].val.opval)); }
 
     break;
 
   case 214:
-#line 1170 "perly.y" /* yacc.c:1646  */
+#line 1176 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newAVREF((ps[-3].val.opval)); }
 
     break;
 
   case 215:
-#line 1172 "perly.y" /* yacc.c:1646  */
+#line 1178 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newHVREF((ps[-3].val.opval)); }
 
     break;
 
   case 216:
-#line 1174 "perly.y" /* yacc.c:1646  */
+#line 1180 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, 0,
                                       scalar(newCVREF((ps[-1].val.ival),(ps[-3].val.opval)))); }
 
     break;
 
   case 217:
-#line 1177 "perly.y" /* yacc.c:1646  */
+#line 1183 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newGVREF(0,(ps[-3].val.opval)); }
 
     break;
 
   case 218:
-#line 1179 "perly.y" /* yacc.c:1646  */
+#line 1185 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newOP((ps[0].val.ival), OPf_SPECIAL);
                            PL_hints |= HINT_BLOCK_SCOPE; }
 
     break;
 
   case 219:
-#line 1182 "perly.y" /* yacc.c:1646  */
+#line 1188 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newLOOPEX((ps[-1].val.ival),(ps[0].val.opval)); }
 
     break;
 
   case 220:
-#line 1184 "perly.y" /* yacc.c:1646  */
+#line 1190 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
 
     break;
 
   case 221:
-#line 1186 "perly.y" /* yacc.c:1646  */
+#line 1192 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newOP((ps[0].val.ival), 0); }
 
     break;
 
   case 222:
-#line 1188 "perly.y" /* yacc.c:1646  */
+#line 1194 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
 
     break;
 
   case 223:
-#line 1190 "perly.y" /* yacc.c:1646  */
+#line 1196 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
 
     break;
 
   case 224:
-#line 1192 "perly.y" /* yacc.c:1646  */
+#line 1198 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newOP(OP_REQUIRE, (ps[0].val.ival) ? OPf_SPECIAL : 0); }
 
     break;
 
   case 225:
-#line 1194 "perly.y" /* yacc.c:1646  */
+#line 1200 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[-1].val.ival) ? OPf_SPECIAL : 0, (ps[0].val.opval)); }
 
     break;
 
   case 226:
-#line 1196 "perly.y" /* yacc.c:1646  */
+#line 1202 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
 
     break;
 
   case 227:
-#line 1198 "perly.y" /* yacc.c:1646  */
+#line 1204 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval)))); }
 
     break;
 
   case 228:
-#line 1201 "perly.y" /* yacc.c:1646  */
+#line 1207 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newOP((ps[0].val.ival), 0); }
 
     break;
 
   case 229:
-#line 1203 "perly.y" /* yacc.c:1646  */
+#line 1209 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newOP((ps[-2].val.ival), 0);}
 
     break;
 
   case 230:
-#line 1205 "perly.y" /* yacc.c:1646  */
+#line 1211 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 231:
-#line 1207 "perly.y" /* yacc.c:1646  */
+#line 1213 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[-2].val.opval); }
 
     break;
 
   case 232:
-#line 1209 "perly.y" /* yacc.c:1646  */
+#line 1215 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
 
     break;
 
   case 233:
-#line 1211 "perly.y" /* yacc.c:1646  */
+#line 1217 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = ((ps[-2].val.ival) == OP_NOT)
                           ? newUNOP((ps[-2].val.ival), 0, newSVOP(OP_CONST, 0, newSViv(0)))
                           : newOP((ps[-2].val.ival), OPf_SPECIAL); }
@@ -1800,13 +1806,13 @@ case 2:
     break;
 
   case 234:
-#line 1215 "perly.y" /* yacc.c:1646  */
+#line 1221 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
 
     break;
 
   case 235:
-#line 1217 "perly.y" /* yacc.c:1646  */
+#line 1223 "perly.y" /* yacc.c:1648  */
     {
                            if (   (ps[0].val.opval)->op_type != OP_TRANS
                                && (ps[0].val.opval)->op_type != OP_TRANSR
@@ -1821,115 +1827,115 @@ case 2:
     break;
 
   case 236:
-#line 1228 "perly.y" /* yacc.c:1646  */
+#line 1234 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = pmruntime((ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), 1, (ps[-4].val.ival)); }
 
     break;
 
   case 240:
-#line 1236 "perly.y" /* yacc.c:1646  */
+#line 1242 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = my_attrs((ps[-1].val.opval),(ps[0].val.opval)); }
 
     break;
 
   case 241:
-#line 1238 "perly.y" /* yacc.c:1646  */
+#line 1244 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = localize((ps[0].val.opval),1); }
 
     break;
 
   case 242:
-#line 1240 "perly.y" /* yacc.c:1646  */
+#line 1246 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, my_attrs((ps[-1].val.opval),(ps[0].val.opval))); }
 
     break;
 
   case 243:
-#line 1245 "perly.y" /* yacc.c:1646  */
+#line 1251 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = sawparens((ps[-1].val.opval)); }
 
     break;
 
   case 244:
-#line 1247 "perly.y" /* yacc.c:1646  */
+#line 1253 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = sawparens(newNULLLIST()); }
 
     break;
 
   case 245:
-#line 1250 "perly.y" /* yacc.c:1646  */
+#line 1256 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 246:
-#line 1252 "perly.y" /* yacc.c:1646  */
+#line 1258 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 247:
-#line 1254 "perly.y" /* yacc.c:1646  */
+#line 1260 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 248:
-#line 1259 "perly.y" /* yacc.c:1646  */
+#line 1265 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 249:
-#line 1261 "perly.y" /* yacc.c:1646  */
+#line 1267 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 250:
-#line 1265 "perly.y" /* yacc.c:1646  */
+#line 1271 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 251:
-#line 1267 "perly.y" /* yacc.c:1646  */
+#line 1273 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 252:
-#line 1271 "perly.y" /* yacc.c:1646  */
+#line 1277 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 253:
-#line 1273 "perly.y" /* yacc.c:1646  */
+#line 1279 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 254:
-#line 1279 "perly.y" /* yacc.c:1646  */
+#line 1285 "perly.y" /* yacc.c:1648  */
     { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); }
 
     break;
 
   case 262:
-#line 1296 "perly.y" /* yacc.c:1646  */
+#line 1302 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newCVREF((ps[-1].val.ival),(ps[0].val.opval)); }
 
     break;
 
   case 263:
-#line 1300 "perly.y" /* yacc.c:1646  */
+#line 1306 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newSVREF((ps[0].val.opval)); }
 
     break;
 
   case 264:
-#line 1304 "perly.y" /* yacc.c:1646  */
+#line 1310 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newAVREF((ps[0].val.opval));
                          if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival);
                        }
@@ -1937,7 +1943,7 @@ case 2:
     break;
 
   case 265:
-#line 1310 "perly.y" /* yacc.c:1646  */
+#line 1316 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newHVREF((ps[0].val.opval));
                          if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival);
                        }
@@ -1945,61 +1951,61 @@ case 2:
     break;
 
   case 266:
-#line 1316 "perly.y" /* yacc.c:1646  */
+#line 1322 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newAVREF((ps[0].val.opval)); }
 
     break;
 
   case 267:
-#line 1318 "perly.y" /* yacc.c:1646  */
+#line 1324 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newAVREF((ps[-3].val.opval)); }
 
     break;
 
   case 268:
-#line 1322 "perly.y" /* yacc.c:1646  */
+#line 1328 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newGVREF(0,(ps[0].val.opval)); }
 
     break;
 
   case 270:
-#line 1327 "perly.y" /* yacc.c:1646  */
+#line 1333 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newAVREF((ps[-2].val.opval)); }
 
     break;
 
   case 272:
-#line 1332 "perly.y" /* yacc.c:1646  */
+#line 1338 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newHVREF((ps[-2].val.opval)); }
 
     break;
 
   case 274:
-#line 1337 "perly.y" /* yacc.c:1646  */
+#line 1343 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = newGVREF(0,(ps[-2].val.opval)); }
 
     break;
 
   case 275:
-#line 1342 "perly.y" /* yacc.c:1646  */
+#line 1348 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = scalar((ps[0].val.opval)); }
 
     break;
 
   case 276:
-#line 1344 "perly.y" /* yacc.c:1646  */
+#line 1350 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = scalar((ps[0].val.opval)); }
 
     break;
 
   case 277:
-#line 1346 "perly.y" /* yacc.c:1646  */
+#line 1352 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = op_scope((ps[0].val.opval)); }
 
     break;
 
   case 278:
-#line 1349 "perly.y" /* yacc.c:1646  */
+#line 1355 "perly.y" /* yacc.c:1648  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
@@ -2010,6 +2016,6 @@ case 2:
     
 
 /* Generated from:
- * ac323bb6f3cacf4eb8eda6403a58c41f30954d07a4a6d6f7f00de81577b2c79a perly.y
+ * 7aa97cfabf5b87a95ed263373e76c7af6d7e075e83d12e84ccdca9690c15a68d perly.y
  * b6fae5748f9bef6db4740aa5e122b84ac5181852d42474d0ecad621fa4253306 regen_perly.pl
  * ex: set ro: */
diff --git a/perly.h b/perly.h
index 7727e7b..8e9d4c3 100644 (file)
--- a/perly.h
+++ b/perly.h
@@ -7,11 +7,11 @@
 #define PERL_BISON_VERSION  30000
 
 #ifdef PERL_CORE
-/* A Bison parser, made by GNU Bison 3.0.2.  */
+/* A Bison parser, made by GNU Bison 3.0.5.  */
 
 /* Bison interface for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -146,6 +146,7 @@ S_is_opval_token(int type) {
     case FUNC0OP:
     case FUNC0SUB:
     case FUNCMETH:
+    case LABEL:
     case LSTOPSUB:
     case METHOD:
     case PLUGEXPR:
@@ -162,7 +163,7 @@ S_is_opval_token(int type) {
 #endif /* PERL_IN_TOKE_C */
 #endif /* PERL_CORE */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE YYSTYPE;
+
 union YYSTYPE
 {
 
@@ -173,6 +174,8 @@ union YYSTYPE
     GV *gvval;
 
 };
+
+typedef union YYSTYPE YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define YYSTYPE_IS_DECLARED 1
 #endif
@@ -183,6 +186,6 @@ int yyparse (void);
 
 
 /* Generated from:
- * ac323bb6f3cacf4eb8eda6403a58c41f30954d07a4a6d6f7f00de81577b2c79a perly.y
+ * 7aa97cfabf5b87a95ed263373e76c7af6d7e075e83d12e84ccdca9690c15a68d perly.y
  * b6fae5748f9bef6db4740aa5e122b84ac5181852d42474d0ecad621fa4253306 regen_perly.pl
  * ex: set ro: */
index d918aa6..f03bc0f 100644 (file)
--- a/perly.tab
+++ b/perly.tab
@@ -71,32 +71,32 @@ static const yytype_uint16 yyrline[] =
 {
        0,   119,   119,   118,   130,   129,   140,   139,   153,   152,
      166,   165,   179,   178,   191,   199,   207,   211,   219,   225,
-     226,   236,   237,   246,   250,   254,   258,   265,   267,   280,
-     277,   301,   296,   317,   325,   324,   333,   339,   345,   350,
-     352,   354,   361,   369,   371,   368,   388,   393,   400,   399,
-     414,   422,   428,   435,   434,   449,   453,   458,   466,   484,
-     485,   490,   492,   494,   496,   498,   500,   502,   505,   511,
-     512,   517,   528,   529,   535,   541,   542,   547,   550,   554,
-     559,   563,   567,   568,   572,   578,   583,   588,   589,   594,
-     595,   600,   601,   603,   608,   610,   622,   623,   628,   630,
-     634,   654,   655,   657,   663,   728,   730,   736,   738,   742,
-     748,   749,   754,   755,   760,   759,   818,   819,   824,   835,
-     836,   839,   850,   852,   854,   856,   860,   862,   867,   871,
-     875,   879,   885,   890,   896,   902,   904,   907,   906,   917,
-     918,   922,   926,   929,   934,   939,   942,   946,   950,   956,
-     964,   971,   977,   979,   981,   986,   988,   990,   995,   997,
-     999,  1001,  1003,  1005,  1007,  1009,  1011,  1013,  1015,  1020,
-    1022,  1025,  1027,  1029,  1032,  1035,  1046,  1049,  1056,  1058,
-    1060,  1062,  1064,  1067,  1073,  1075,  1079,  1080,  1081,  1082,
-    1083,  1085,  1087,  1089,  1091,  1093,  1095,  1097,  1099,  1101,
-    1103,  1105,  1107,  1109,  1111,  1121,  1131,  1141,  1151,  1153,
-    1155,  1158,  1163,  1167,  1169,  1171,  1173,  1176,  1178,  1181,
-    1183,  1185,  1187,  1189,  1191,  1193,  1195,  1197,  1200,  1202,
-    1204,  1206,  1208,  1210,  1214,  1217,  1216,  1229,  1230,  1231,
-    1235,  1237,  1239,  1244,  1246,  1249,  1251,  1253,  1258,  1260,
-    1265,  1266,  1271,  1272,  1278,  1282,  1283,  1284,  1287,  1288,
-    1291,  1292,  1295,  1299,  1303,  1309,  1315,  1317,  1321,  1325,
-    1326,  1330,  1331,  1335,  1336,  1341,  1343,  1345,  1348
+     226,   236,   237,   246,   250,   254,   261,   271,   273,   286,
+     283,   307,   302,   323,   331,   330,   339,   345,   351,   356,
+     358,   360,   367,   375,   377,   374,   394,   399,   406,   405,
+     420,   428,   434,   441,   440,   455,   459,   464,   472,   490,
+     491,   496,   498,   500,   502,   504,   506,   508,   511,   517,
+     518,   523,   534,   535,   541,   547,   548,   553,   556,   560,
+     565,   569,   573,   574,   578,   584,   589,   594,   595,   600,
+     601,   606,   607,   609,   614,   616,   628,   629,   634,   636,
+     640,   660,   661,   663,   669,   734,   736,   742,   744,   748,
+     754,   755,   760,   761,   766,   765,   824,   825,   830,   841,
+     842,   845,   856,   858,   860,   862,   866,   868,   873,   877,
+     881,   885,   891,   896,   902,   908,   910,   913,   912,   923,
+     924,   928,   932,   935,   940,   945,   948,   952,   956,   962,
+     970,   977,   983,   985,   987,   992,   994,   996,  1001,  1003,
+    1005,  1007,  1009,  1011,  1013,  1015,  1017,  1019,  1021,  1026,
+    1028,  1031,  1033,  1035,  1038,  1041,  1052,  1055,  1062,  1064,
+    1066,  1068,  1070,  1073,  1079,  1081,  1085,  1086,  1087,  1088,
+    1089,  1091,  1093,  1095,  1097,  1099,  1101,  1103,  1105,  1107,
+    1109,  1111,  1113,  1115,  1117,  1127,  1137,  1147,  1157,  1159,
+    1161,  1164,  1169,  1173,  1175,  1177,  1179,  1182,  1184,  1187,
+    1189,  1191,  1193,  1195,  1197,  1199,  1201,  1203,  1206,  1208,
+    1210,  1212,  1214,  1216,  1220,  1223,  1222,  1235,  1236,  1237,
+    1241,  1243,  1245,  1250,  1252,  1255,  1257,  1259,  1264,  1266,
+    1271,  1272,  1277,  1278,  1284,  1288,  1289,  1290,  1293,  1294,
+    1297,  1298,  1301,  1305,  1309,  1315,  1321,  1323,  1327,  1331,
+    1332,  1336,  1337,  1341,  1342,  1347,  1349,  1351,  1354
 };
 #endif
 
@@ -1091,7 +1091,7 @@ static const yytype_uint8 yyr2[] =
 };
 
 typedef enum {
-       toketype_ival, toketype_opval, toketype_pval
+       toketype_ival, toketype_opval
 } toketypes;
 
 /* type of each token/terminal */
@@ -1102,7 +1102,7 @@ static const toketypes yy_type_tab[] =
   toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_opval,
   toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
   toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
-  toketype_pval, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
+  toketype_opval, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
   toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival,
@@ -1130,6 +1130,6 @@ static const toketypes yy_type_tab[] =
 };
 
 /* Generated from:
- * ac323bb6f3cacf4eb8eda6403a58c41f30954d07a4a6d6f7f00de81577b2c79a perly.y
+ * 7aa97cfabf5b87a95ed263373e76c7af6d7e075e83d12e84ccdca9690c15a68d perly.y
  * b6fae5748f9bef6db4740aa5e122b84ac5181852d42474d0ecad621fa4253306 regen_perly.pl
  * ex: set ro: */
diff --git a/perly.y b/perly.y
index da0b3e3..1170df8 100644 (file)
--- a/perly.y
+++ b/perly.y
@@ -50,7 +50,7 @@
 %token <opval> BAREWORD METHOD FUNCMETH THING PMFUNC PRIVATEREF QWLIST
 %token <opval> FUNC0OP FUNC0SUB UNIOPSUB LSTOPSUB
 %token <opval> PLUGEXPR PLUGSTMT
-%token <pval> LABEL
+%token <opval> LABEL
 %token <ival> FORMAT SUB SIGSUB ANONSUB ANON_SIGSUB PACKAGE USE
 %token <ival> WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE FOR
 %token <ival> GIVEN WHEN DEFAULT
@@ -253,11 +253,17 @@ fullstmt: barestmt
 
 labfullstmt:   LABEL barestmt
                        {
-                         $$ = newSTATEOP(SVf_UTF8 * $1[strlen($1)+1], $1, $2);
+                          SV *label = cSVOPx_sv($1);
+                         $$ = newSTATEOP(SvFLAGS(label) & SVf_UTF8,
+                                            savepv(SvPVX_const(label)), $2);
+                          op_free($1);
                        }
        |       LABEL labfullstmt
                        {
-                         $$ = newSTATEOP(SVf_UTF8 * $1[strlen($1)+1], $1, $2);
+                          SV *label = cSVOPx_sv($1);
+                         $$ = newSTATEOP(SvFLAGS(label) & SVf_UTF8,
+                                            savepv(SvPVX_const(label)), $2);
+                          op_free($1);
                        }
        ;
 
diff --git a/toke.c b/toke.c
index 8b0c655..0273566 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -340,7 +340,7 @@ static struct debug_tokens {
     { GIVEN,           TOKENTYPE_IVAL,         "GIVEN" },
     { HASHBRACK,       TOKENTYPE_NONE,         "HASHBRACK" },
     { IF,              TOKENTYPE_IVAL,         "IF" },
-    { LABEL,           TOKENTYPE_PVAL,         "LABEL" },
+    { LABEL,           TOKENTYPE_OPVAL,        "LABEL" },
     { LOCAL,           TOKENTYPE_IVAL,         "LOCAL" },
     { LOOPEX,          TOKENTYPE_OPNUM,        "LOOPEX" },
     { LSTOP,           TOKENTYPE_OPNUM,        "LSTOP" },
@@ -7192,9 +7192,9 @@ Perl_yylex(pTHX)
        if (!anydelim && PL_expect == XSTATE
              && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
            s = d + 1;
-           pl_yylval.pval = savepvn(PL_tokenbuf, len+1);
-           pl_yylval.pval[len] = '\0';
-           pl_yylval.pval[len+1] = UTF ? 1 : 0;
+            pl_yylval.pval =
+                newSVOP(OP_CONST, 0,
+                    newSVpvn_flags(PL_tokenbuf, len, UTF ? SVf_UTF8 : 0));
            CLINE;
            TOKEN(LABEL);
        }
@@ -12577,10 +12577,11 @@ Perl_parse_label(pTHX_ U32 flags)
     if (PL_nexttoke) {
        PL_parser->yychar = yylex();
        if (PL_parser->yychar == LABEL) {
-           char * const lpv = pl_yylval.pval;
-           STRLEN llen = strlen(lpv);
+           SV * const labelsv = cSVOPx(pl_yylval.opval)->op_sv;
            PL_parser->yychar = YYEMPTY;
-           return newSVpvn_flags(lpv, llen, lpv[llen+1] ? SVf_UTF8 : 0);
+           cSVOPx(pl_yylval.opval)->op_sv = NULL;
+           op_free(pl_yylval.opval);
+           return labelsv;
        } else {
            yyunlex();
            goto no_label;