Fix leaks in label strings allocation in COPs
Rafael Garcia-Suarez [Wed, 20 Dec 2006 11:15:29 +0000 (11:15 +0000)]
p4raw-id: //depot/perl@29601

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

diff --git a/cop.h b/cop.h
index 91f8d45..e80f865 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -187,20 +187,17 @@ struct cop {
 #  define CopSTASH_set(c,hv)   CopSTASHPV_set(c, (hv) ? HvNAME_get(hv) : NULL)
 #  define CopSTASH_eq(c,hv)    ((hv) && stashpv_hvname_match(c,hv))
 #  define CopLABEL(c)          ((c)->cop_label)
-/* Don't free the original label here, it will be freed by the parser */
-#  ifdef NETWARE
-#    define CopLABEL_set(c,pv) (CopLABEL(c) = ((pv) ? savepv(pv) : NULL))
-#  else
-#    define CopLABEL_set(c,pv) (CopLABEL(c) = savesharedpv(pv))
-#  endif
+#  define CopLABEL_set(c,pv)   (CopLABEL(c) = (pv))
 #  ifdef NETWARE
 #    define CopSTASH_free(c) SAVECOPSTASH_FREE(c)
 #    define CopFILE_free(c) SAVECOPFILE_FREE(c)
 #    define CopLABEL_free(c) SAVECOPLABEL_FREE(c)
+#    define CopLABEL_alloc(pv) ((pv)?savepv(pv):NULL)
 #  else
 #    define CopSTASH_free(c)   PerlMemShared_free(CopSTASHPV(c))
 #    define CopFILE_free(c)    (PerlMemShared_free(CopFILE(c)),(CopFILE(c) = NULL))
 #    define CopLABEL_free(c)   (PerlMemShared_free(CopLABEL(c)),(CopLABEL(c) = NULL))
+#    define CopLABEL_alloc(pv) ((pv)?savesharedpv(pv):NULL)
 #  endif
 #else
 #  define CopFILEGV(c)         ((c)->cop_filegv)
@@ -221,10 +218,11 @@ struct cop {
    /* cop_stash is not refcounted */
 #  define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
 #  define CopSTASH_eq(c,hv)    (CopSTASH(c) == (hv))
+#  define CopLABEL_alloc(pv)   ((pv)?savepv(pv):NULL)
 #  define CopLABEL_set(c,pv)   (CopLABEL(c) = (pv))
 #  define CopSTASH_free(c)     
 #  define CopFILE_free(c)      (SvREFCNT_dec(CopFILEGV(c)),(CopFILEGV(c) = NULL))
-#  define CopLABEL_free(c)     
+#  define CopLABEL_free(c)     (Safefree(CopLABEL(c)),(CopLABEL(c) = NULL))
 
 #endif /* USE_ITHREADS */
 
index 921df69..84809ca 100644 (file)
--- a/perly.act
+++ b/perly.act
@@ -324,8 +324,7 @@ case 2:
 #ifdef MAD
                          forop = newUNOP(OP_NULL, 0, append_elem(OP_LINESEQ,
                                newSTATEOP(0,
-                                          (((ps[(1) - (12)].val.p_tkval))->tk_lval.pval
-                                          ?savepv(((ps[(1) - (12)].val.p_tkval))->tk_lval.pval):Nullch),
+                                          CopLABEL_alloc(((ps[(1) - (12)].val.p_tkval))->tk_lval.pval),
                                           ((ps[(5) - (12)].val.opval) ? newOP(OP_NULL, 0) : (ps[(5) - (12)].val.opval)) ),
                                forop));
 
@@ -338,8 +337,7 @@ case 2:
 #else
                          if ((ps[(5) - (12)].val.opval)) {
                                forop = append_elem(OP_LINESEQ,
-                                        newSTATEOP(0, ((ps[(1) - (12)].val.p_tkval)?savepv((ps[(1) - (12)].val.p_tkval)):Nullch),
-                                                  (ps[(5) - (12)].val.opval)),
+                                        newSTATEOP(0, CopLABEL_alloc((ps[(1) - (12)].val.p_tkval)), (ps[(5) - (12)].val.opval)),
                                        forop);
                          }
 
@@ -349,7 +347,7 @@ case 2:
     break;
 
   case 41:
-#line 416 "perly.y"
+#line 414 "perly.y"
     { (yyval.opval) = newSTATEOP(0, PVAL((ps[(1) - (3)].val.p_tkval)),
                                 newWHILEOP(0, 1, (LOOP*)Nullop,
                                            NOLINE, Nullop, (ps[(2) - (3)].val.opval), (ps[(3) - (3)].val.opval), 0));
@@ -357,7 +355,7 @@ case 2:
     break;
 
   case 42:
-#line 424 "perly.y"
+#line 422 "perly.y"
     { PL_copline = (line_t) (ps[(2) - (8)].val.i_tkval);
                            (yyval.opval) = block_end((ps[(4) - (8)].val.ival),
                                newSTATEOP(0, PVAL((ps[(1) - (8)].val.p_tkval)),
@@ -366,46 +364,46 @@ case 2:
     break;
 
   case 43:
-#line 433 "perly.y"
+#line 431 "perly.y"
     { (yyval.ival) = (PL_min_intro_pending &&
                            PL_max_intro_pending >=  PL_min_intro_pending);
                          intro_my(); ;}
     break;
 
   case 44:
-#line 439 "perly.y"
+#line 437 "perly.y"
     { (yyval.opval) = Nullop; ;}
     break;
 
   case 46:
-#line 445 "perly.y"
+#line 443 "perly.y"
     { YYSTYPE tmplval;
                          (void)scan_num("1", &tmplval);
                          (yyval.opval) = tmplval.opval; ;}
     break;
 
   case 48:
-#line 453 "perly.y"
+#line 451 "perly.y"
     { (yyval.opval) = invert(scalar((ps[(1) - (1)].val.opval))); ;}
     break;
 
   case 49:
-#line 458 "perly.y"
+#line 456 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); ;}
     break;
 
   case 50:
-#line 462 "perly.y"
+#line 460 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); ;}
     break;
 
   case 51:
-#line 466 "perly.y"
+#line 464 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); ;}
     break;
 
   case 52:
-#line 471 "perly.y"
+#line 469 "perly.y"
     {
 #ifdef MAD
                          YYSTYPE tmplval;
@@ -418,44 +416,44 @@ case 2:
     break;
 
   case 54:
-#line 485 "perly.y"
+#line 483 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 55:
-#line 487 "perly.y"
+#line 485 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 56:
-#line 489 "perly.y"
+#line 487 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 57:
-#line 491 "perly.y"
+#line 489 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 58:
-#line 493 "perly.y"
+#line 491 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 59:
-#line 498 "perly.y"
+#line 496 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 60:
-#line 502 "perly.y"
+#line 500 "perly.y"
     { (yyval.opval) = newOP(OP_NULL,0);
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'p');
                        ;}
     break;
 
   case 61:
-#line 508 "perly.y"
+#line 506 "perly.y"
     { SvREFCNT_inc(PL_compcv);
 #ifdef MAD
                          (yyval.opval) = newFORM((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval), (ps[(4) - (4)].val.opval));
@@ -470,17 +468,17 @@ case 2:
     break;
 
   case 62:
-#line 521 "perly.y"
+#line 519 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 63:
-#line 522 "perly.y"
+#line 520 "perly.y"
     { (yyval.opval) = Nullop; ;}
     break;
 
   case 64:
-#line 527 "perly.y"
+#line 525 "perly.y"
     { SvREFCNT_inc(PL_compcv);
 #ifdef MAD
                          (yyval.opval) = newMYSUB((ps[(2) - (6)].val.ival), (ps[(3) - (6)].val.opval), (ps[(4) - (6)].val.opval), (ps[(5) - (6)].val.opval), (ps[(6) - (6)].val.opval));
@@ -493,7 +491,7 @@ case 2:
     break;
 
   case 65:
-#line 540 "perly.y"
+#line 538 "perly.y"
     { SvREFCNT_inc(PL_compcv);
 #ifdef MAD
                          OP* o = newSVOP(OP_ANONCODE, 0,
@@ -514,25 +512,25 @@ case 2:
     break;
 
   case 66:
-#line 560 "perly.y"
+#line 558 "perly.y"
     { (yyval.ival) = start_subparse(FALSE, 0);
                            SAVEFREESV(PL_compcv); ;}
     break;
 
   case 67:
-#line 566 "perly.y"
+#line 564 "perly.y"
     { (yyval.ival) = start_subparse(FALSE, CVf_ANON);
                            SAVEFREESV(PL_compcv); ;}
     break;
 
   case 68:
-#line 571 "perly.y"
+#line 569 "perly.y"
     { (yyval.ival) = start_subparse(TRUE, 0);
                            SAVEFREESV(PL_compcv); ;}
     break;
 
   case 69:
-#line 576 "perly.y"
+#line 574 "perly.y"
     { const char *const name = SvPV_nolen_const(((SVOP*)(ps[(1) - (1)].val.opval))->op_sv);
                          if (strEQ(name, "BEGIN") || strEQ(name, "END")
                              || strEQ(name, "INIT") || strEQ(name, "CHECK")
@@ -542,24 +540,24 @@ case 2:
     break;
 
   case 70:
-#line 586 "perly.y"
+#line 584 "perly.y"
     { (yyval.opval) = Nullop; ;}
     break;
 
   case 72:
-#line 592 "perly.y"
+#line 590 "perly.y"
     { (yyval.opval) = Nullop; ;}
     break;
 
   case 73:
-#line 594 "perly.y"
+#line 592 "perly.y"
     { (yyval.opval) = (ps[(2) - (2)].val.opval);
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),':');
                        ;}
     break;
 
   case 74:
-#line 598 "perly.y"
+#line 596 "perly.y"
     { (yyval.opval) = IF_MAD(
                                    newOP(OP_NULL, 0),
                                    Nullop
@@ -569,14 +567,14 @@ case 2:
     break;
 
   case 75:
-#line 608 "perly.y"
+#line 606 "perly.y"
     { (yyval.opval) = (ps[(2) - (2)].val.opval);
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),':');
                        ;}
     break;
 
   case 76:
-#line 612 "perly.y"
+#line 610 "perly.y"
     { (yyval.opval) = IF_MAD(
                                    newOP(OP_NULL, 0),
                                    Nullop
@@ -586,12 +584,12 @@ case 2:
     break;
 
   case 77:
-#line 621 "perly.y"
+#line 619 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 78:
-#line 622 "perly.y"
+#line 620 "perly.y"
     { (yyval.opval) = IF_MAD(
                                    newOP(OP_NULL,0),
                                    Nullop
@@ -602,7 +600,7 @@ case 2:
     break;
 
   case 79:
-#line 632 "perly.y"
+#line 630 "perly.y"
     {
 #ifdef MAD
                          (yyval.opval) = package((ps[(2) - (3)].val.opval));
@@ -616,12 +614,12 @@ case 2:
     break;
 
   case 80:
-#line 645 "perly.y"
+#line 643 "perly.y"
     { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ ;}
     break;
 
   case 81:
-#line 647 "perly.y"
+#line 645 "perly.y"
     { SvREFCNT_inc(PL_compcv);
 #ifdef MAD
                          (yyval.opval) = utilize(IVAL((ps[(1) - (7)].val.i_tkval)), (ps[(2) - (7)].val.ival), (ps[(4) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval));
@@ -637,28 +635,28 @@ case 2:
     break;
 
   case 82:
-#line 663 "perly.y"
+#line 661 "perly.y"
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 83:
-#line 667 "perly.y"
+#line 665 "perly.y"
     { (yyval.opval) = newLOGOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 84:
-#line 671 "perly.y"
+#line 669 "perly.y"
     { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 86:
-#line 679 "perly.y"
+#line 677 "perly.y"
     {
 #ifdef MAD
                          OP* op = newNULLLIST();
@@ -671,7 +669,7 @@ case 2:
     break;
 
   case 87:
-#line 689 "perly.y"
+#line 687 "perly.y"
     { 
                          OP* term = (ps[(3) - (3)].val.opval);
                          DO_MAD(
@@ -683,7 +681,7 @@ case 2:
     break;
 
   case 89:
-#line 702 "perly.y"
+#line 700 "perly.y"
     { (yyval.opval) = convert(IVAL((ps[(1) - (3)].val.i_tkval)), OPf_STACKED,
                                prepend_elem(OP_LIST, newGVREF(IVAL((ps[(1) - (3)].val.i_tkval)),(ps[(2) - (3)].val.opval)), (ps[(3) - (3)].val.opval)) );
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
@@ -691,7 +689,7 @@ case 2:
     break;
 
   case 90:
-#line 707 "perly.y"
+#line 705 "perly.y"
     { (yyval.opval) = convert(IVAL((ps[(1) - (5)].val.i_tkval)), OPf_STACKED,
                                prepend_elem(OP_LIST, newGVREF(IVAL((ps[(1) - (5)].val.i_tkval)),(ps[(3) - (5)].val.opval)), (ps[(4) - (5)].val.opval)) );
                          TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o');
@@ -701,7 +699,7 @@ case 2:
     break;
 
   case 91:
-#line 714 "perly.y"
+#line 712 "perly.y"
     { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED,
                                append_elem(OP_LIST,
                                    prepend_elem(OP_LIST, scalar((ps[(1) - (6)].val.opval)), (ps[(5) - (6)].val.opval)),
@@ -713,7 +711,7 @@ case 2:
     break;
 
   case 92:
-#line 723 "perly.y"
+#line 721 "perly.y"
     { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED,
                                append_elem(OP_LIST, scalar((ps[(1) - (3)].val.opval)),
                                    newUNOP(OP_METHOD, 0, (ps[(3) - (3)].val.opval))));
@@ -722,7 +720,7 @@ case 2:
     break;
 
   case 93:
-#line 729 "perly.y"
+#line 727 "perly.y"
     { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED,
                                append_elem(OP_LIST,
                                    prepend_elem(OP_LIST, (ps[(2) - (3)].val.opval), (ps[(3) - (3)].val.opval)),
@@ -731,7 +729,7 @@ case 2:
     break;
 
   case 94:
-#line 735 "perly.y"
+#line 733 "perly.y"
     { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED,
                                append_elem(OP_LIST,
                                    prepend_elem(OP_LIST, (ps[(2) - (5)].val.opval), (ps[(4) - (5)].val.opval)),
@@ -742,14 +740,14 @@ case 2:
     break;
 
   case 95:
-#line 743 "perly.y"
+#line 741 "perly.y"
     { (yyval.opval) = convert(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 96:
-#line 747 "perly.y"
+#line 745 "perly.y"
     { (yyval.opval) = convert(IVAL((ps[(1) - (4)].val.i_tkval)), 0, (ps[(3) - (4)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o');
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'(');
@@ -758,13 +756,13 @@ case 2:
     break;
 
   case 97:
-#line 753 "perly.y"
+#line 751 "perly.y"
     { SvREFCNT_inc(PL_compcv);
                          (yyval.opval) = newANONATTRSUB((ps[(2) - (3)].val.ival), 0, Nullop, (ps[(3) - (3)].val.opval)); ;}
     break;
 
   case 98:
-#line 756 "perly.y"
+#line 754 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                 append_elem(OP_LIST,
                                   prepend_elem(OP_LIST, (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)), (ps[(1) - (5)].val.opval)));
@@ -772,7 +770,7 @@ case 2:
     break;
 
   case 101:
-#line 771 "perly.y"
+#line 769 "perly.y"
     { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[(1) - (5)].val.opval), scalar((ps[(3) - (5)].val.opval)));
                            PL_expect = XOPERATOR;
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
@@ -782,7 +780,7 @@ case 2:
     break;
 
   case 102:
-#line 778 "perly.y"
+#line 776 "perly.y"
     { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[(1) - (4)].val.opval)), scalar((ps[(3) - (4)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'[');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']');
@@ -790,7 +788,7 @@ case 2:
     break;
 
   case 103:
-#line 783 "perly.y"
+#line 781 "perly.y"
     { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[(1) - (5)].val.opval)),OP_RV2AV),
                                        scalar((ps[(4) - (5)].val.opval)));
@@ -801,7 +799,7 @@ case 2:
     break;
 
   case 104:
-#line 791 "perly.y"
+#line 789 "perly.y"
     { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[(1) - (4)].val.opval)),OP_RV2AV),
                                        scalar((ps[(3) - (4)].val.opval)));
@@ -811,7 +809,7 @@ case 2:
     break;
 
   case 105:
-#line 798 "perly.y"
+#line 796 "perly.y"
     { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[(1) - (5)].val.opval)), jmaybe((ps[(3) - (5)].val.opval)));
                            PL_expect = XOPERATOR;
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
@@ -821,7 +819,7 @@ case 2:
     break;
 
   case 106:
-#line 805 "perly.y"
+#line 803 "perly.y"
     { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[(1) - (6)].val.opval)),OP_RV2HV),
                                        jmaybe((ps[(4) - (6)].val.opval)));
@@ -834,7 +832,7 @@ case 2:
     break;
 
   case 107:
-#line 815 "perly.y"
+#line 813 "perly.y"
     { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[(1) - (5)].val.opval)),OP_RV2HV),
                                        jmaybe((ps[(3) - (5)].val.opval)));
@@ -846,7 +844,7 @@ case 2:
     break;
 
   case 108:
-#line 824 "perly.y"
+#line 822 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar((ps[(1) - (4)].val.opval))));
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'a');
@@ -856,7 +854,7 @@ case 2:
     break;
 
   case 109:
-#line 831 "perly.y"
+#line 829 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   append_elem(OP_LIST, (ps[(4) - (5)].val.opval),
                                       newCVREF(0, scalar((ps[(1) - (5)].val.opval)))));
@@ -867,7 +865,7 @@ case 2:
     break;
 
   case 110:
-#line 840 "perly.y"
+#line 838 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   append_elem(OP_LIST, (ps[(3) - (4)].val.opval),
                                               newCVREF(0, scalar((ps[(1) - (4)].val.opval)))));
@@ -877,7 +875,7 @@ case 2:
     break;
 
   case 111:
-#line 847 "perly.y"
+#line 845 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar((ps[(1) - (3)].val.opval))));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
@@ -886,7 +884,7 @@ case 2:
     break;
 
   case 112:
-#line 853 "perly.y"
+#line 851 "perly.y"
     { (yyval.opval) = newSLICEOP(0, (ps[(5) - (6)].val.opval), (ps[(2) - (6)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (6)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(3) - (6)].val.i_tkval),(yyval.opval),')');
@@ -896,7 +894,7 @@ case 2:
     break;
 
   case 113:
-#line 860 "perly.y"
+#line 858 "perly.y"
     { (yyval.opval) = newSLICEOP(0, (ps[(4) - (5)].val.opval), Nullop);
                          TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),')');
@@ -906,21 +904,21 @@ case 2:
     break;
 
   case 114:
-#line 870 "perly.y"
+#line 868 "perly.y"
     { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[(1) - (3)].val.opval), IVAL((ps[(2) - (3)].val.i_tkval)), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 115:
-#line 874 "perly.y"
+#line 872 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 116:
-#line 878 "perly.y"
+#line 876 "perly.y"
     {   if (IVAL((ps[(2) - (3)].val.i_tkval)) != OP_REPEAT)
                                scalar((ps[(1) - (3)].val.opval));
                            (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, (ps[(1) - (3)].val.opval), scalar((ps[(3) - (3)].val.opval)));
@@ -929,49 +927,49 @@ case 2:
     break;
 
   case 117:
-#line 884 "perly.y"
+#line 882 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 118:
-#line 888 "perly.y"
+#line 886 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 119:
-#line 892 "perly.y"
+#line 890 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 120:
-#line 896 "perly.y"
+#line 894 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 121:
-#line 900 "perly.y"
+#line 898 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 122:
-#line 904 "perly.y"
+#line 902 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 123:
-#line 908 "perly.y"
+#line 906 "perly.y"
     {
                          (yyval.opval) = newRANGE(IVAL((ps[(2) - (3)].val.i_tkval)), scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          DO_MAD(
@@ -986,28 +984,28 @@ case 2:
     break;
 
   case 124:
-#line 920 "perly.y"
+#line 918 "perly.y"
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 125:
-#line 924 "perly.y"
+#line 922 "perly.y"
     { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 126:
-#line 928 "perly.y"
+#line 926 "perly.y"
     { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 127:
-#line 932 "perly.y"
+#line 930 "perly.y"
     { (yyval.opval) = bind_match(IVAL((ps[(2) - (3)].val.i_tkval)), (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),
                                ((yyval.opval)->op_type == OP_NOT
@@ -1017,14 +1015,14 @@ case 2:
     break;
 
   case 128:
-#line 942 "perly.y"
+#line 940 "perly.y"
     { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[(2) - (2)].val.opval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 129:
-#line 946 "perly.y"
+#line 944 "perly.y"
     { (yyval.opval) = IF_MAD(
                                    newUNOP(OP_NULL, 0, (ps[(2) - (2)].val.opval)),
                                    (ps[(2) - (2)].val.opval)
@@ -1034,21 +1032,21 @@ case 2:
     break;
 
   case 130:
-#line 953 "perly.y"
+#line 951 "perly.y"
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 131:
-#line 957 "perly.y"
+#line 955 "perly.y"
     { (yyval.opval) = newUNOP(OP_COMPLEMENT, 0, scalar((ps[(2) - (2)].val.opval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 132:
-#line 961 "perly.y"
+#line 959 "perly.y"
     { (yyval.opval) = newUNOP(OP_POSTINC, 0,
                                        mod(scalar((ps[(1) - (2)].val.opval)), OP_POSTINC));
                          TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o');
@@ -1056,7 +1054,7 @@ case 2:
     break;
 
   case 133:
-#line 966 "perly.y"
+#line 964 "perly.y"
     { (yyval.opval) = newUNOP(OP_POSTDEC, 0,
                                        mod(scalar((ps[(1) - (2)].val.opval)), OP_POSTDEC));
                          TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o');
@@ -1064,7 +1062,7 @@ case 2:
     break;
 
   case 134:
-#line 971 "perly.y"
+#line 969 "perly.y"
     { (yyval.opval) = newUNOP(OP_PREINC, 0,
                                        mod(scalar((ps[(2) - (2)].val.opval)), OP_PREINC));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
@@ -1072,7 +1070,7 @@ case 2:
     break;
 
   case 135:
-#line 976 "perly.y"
+#line 974 "perly.y"
     { (yyval.opval) = newUNOP(OP_PREDEC, 0,
                                        mod(scalar((ps[(2) - (2)].val.opval)), OP_PREDEC));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
@@ -1080,7 +1078,7 @@ case 2:
     break;
 
   case 136:
-#line 985 "perly.y"
+#line 983 "perly.y"
     { (yyval.opval) = newANONLIST((ps[(2) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'[');
                          TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),']');
@@ -1088,7 +1086,7 @@ case 2:
     break;
 
   case 137:
-#line 990 "perly.y"
+#line 988 "perly.y"
     { (yyval.opval) = newANONLIST(Nullop);
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'[');
                          TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),']');
@@ -1096,7 +1094,7 @@ case 2:
     break;
 
   case 138:
-#line 995 "perly.y"
+#line 993 "perly.y"
     { (yyval.opval) = newANONHASH((ps[(2) - (4)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'{');
                          TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),';');
@@ -1105,7 +1103,7 @@ case 2:
     break;
 
   case 139:
-#line 1001 "perly.y"
+#line 999 "perly.y"
     { (yyval.opval) = newANONHASH(Nullop);
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'{');
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),';');
@@ -1114,7 +1112,7 @@ case 2:
     break;
 
   case 140:
-#line 1007 "perly.y"
+#line 1005 "perly.y"
     { SvREFCNT_inc(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));
                          TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o');
@@ -1124,21 +1122,21 @@ case 2:
     break;
 
   case 141:
-#line 1018 "perly.y"
+#line 1016 "perly.y"
     { (yyval.opval) = dofile((ps[(2) - (2)].val.opval), IVAL((ps[(1) - (2)].val.i_tkval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 142:
-#line 1022 "perly.y"
+#line 1020 "perly.y"
     { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, scope((ps[(2) - (2)].val.opval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'D');
                        ;}
     break;
 
   case 143:
-#line 1026 "perly.y"
+#line 1024 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB,
                            OPf_SPECIAL|OPf_STACKED,
                            prepend_elem(OP_LIST,
@@ -1153,7 +1151,7 @@ case 2:
     break;
 
   case 144:
-#line 1038 "perly.y"
+#line 1036 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB,
                            OPf_SPECIAL|OPf_STACKED,
                            append_elem(OP_LIST,
@@ -1169,7 +1167,7 @@ case 2:
     break;
 
   case 145:
-#line 1051 "perly.y"
+#line 1049 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
                            prepend_elem(OP_LIST,
                                scalar(newCVREF(0,scalar((ps[(2) - (4)].val.opval)))), Nullop)); dep();
@@ -1180,7 +1178,7 @@ case 2:
     break;
 
   case 146:
-#line 1059 "perly.y"
+#line 1057 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
                            prepend_elem(OP_LIST,
                                (ps[(4) - (5)].val.opval),
@@ -1192,7 +1190,7 @@ case 2:
     break;
 
   case 151:
-#line 1075 "perly.y"
+#line 1073 "perly.y"
     { (yyval.opval) = newCONDOP(0, (ps[(1) - (5)].val.opval), (ps[(3) - (5)].val.opval), (ps[(5) - (5)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'?');
                          TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),':');
@@ -1200,26 +1198,26 @@ case 2:
     break;
 
   case 152:
-#line 1080 "perly.y"
+#line 1078 "perly.y"
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, mod((ps[(2) - (2)].val.opval),OP_REFGEN));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 153:
-#line 1084 "perly.y"
+#line 1082 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 154:
-#line 1086 "perly.y"
+#line 1084 "perly.y"
     { (yyval.opval) = localize((ps[(2) - (2)].val.opval),IVAL((ps[(1) - (2)].val.i_tkval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'d');
                        ;}
     break;
 
   case 155:
-#line 1090 "perly.y"
+#line 1088 "perly.y"
     { (yyval.opval) = sawparens(IF_MAD(newUNOP(OP_NULL,0,(ps[(2) - (3)].val.opval)), (ps[(2) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
@@ -1227,7 +1225,7 @@ case 2:
     break;
 
   case 156:
-#line 1095 "perly.y"
+#line 1093 "perly.y"
     { (yyval.opval) = sawparens(newNULLLIST());
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),')');
@@ -1235,37 +1233,37 @@ case 2:
     break;
 
   case 157:
-#line 1100 "perly.y"
+#line 1098 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 158:
-#line 1102 "perly.y"
+#line 1100 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 159:
-#line 1104 "perly.y"
+#line 1102 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 160:
-#line 1106 "perly.y"
+#line 1104 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 161:
-#line 1108 "perly.y"
+#line 1106 "perly.y"
     { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[(1) - (1)].val.opval), OP_AV2ARYLEN));;}
     break;
 
   case 162:
-#line 1110 "perly.y"
+#line 1108 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 163:
-#line 1112 "perly.y"
+#line 1110 "perly.y"
     { (yyval.opval) = prepend_elem(OP_ASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_ASLICE, 0,
@@ -1277,7 +1275,7 @@ case 2:
     break;
 
   case 164:
-#line 1121 "perly.y"
+#line 1119 "perly.y"
     { (yyval.opval) = prepend_elem(OP_HSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_HSLICE, 0,
@@ -1291,17 +1289,17 @@ case 2:
     break;
 
   case 165:
-#line 1132 "perly.y"
+#line 1130 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 166:
-#line 1134 "perly.y"
+#line 1132 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[(1) - (1)].val.opval))); ;}
     break;
 
   case 167:
-#line 1136 "perly.y"
+#line 1134 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
@@ -1309,7 +1307,7 @@ case 2:
     break;
 
   case 168:
-#line 1141 "perly.y"
+#line 1139 "perly.y"
     {
                          (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                append_elem(OP_LIST, (ps[(3) - (4)].val.opval), scalar((ps[(1) - (4)].val.opval))));
@@ -1325,7 +1323,7 @@ case 2:
     break;
 
   case 169:
-#line 1154 "perly.y"
+#line 1152 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            append_elem(OP_LIST, (ps[(3) - (3)].val.opval), scalar((ps[(2) - (3)].val.opval))));
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
@@ -1333,7 +1331,7 @@ case 2:
     break;
 
   case 170:
-#line 1159 "perly.y"
+#line 1157 "perly.y"
     { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), OPf_SPECIAL);
                            PL_hints |= HINT_BLOCK_SCOPE;
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
@@ -1341,70 +1339,70 @@ case 2:
     break;
 
   case 171:
-#line 1164 "perly.y"
+#line 1162 "perly.y"
     { (yyval.opval) = newLOOPEX(IVAL((ps[(1) - (2)].val.i_tkval)),(ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 172:
-#line 1168 "perly.y"
+#line 1166 "perly.y"
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 173:
-#line 1172 "perly.y"
+#line 1170 "perly.y"
     { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), 0);
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 174:
-#line 1176 "perly.y"
+#line 1174 "perly.y"
     { (yyval.opval) = newUNOP(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 175:
-#line 1180 "perly.y"
+#line 1178 "perly.y"
     { (yyval.opval) = newUNOP(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 176:
-#line 1184 "perly.y"
+#line 1182 "perly.y"
     { (yyval.opval) = newOP(OP_REQUIRE, (ps[(1) - (1)].val.i_tkval) ? OPf_SPECIAL : 0); ;}
     break;
 
   case 177:
-#line 1186 "perly.y"
+#line 1184 "perly.y"
     { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[(1) - (2)].val.i_tkval) ? OPf_SPECIAL : 0, (ps[(2) - (2)].val.opval)); ;}
     break;
 
   case 178:
-#line 1188 "perly.y"
+#line 1186 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); ;}
     break;
 
   case 179:
-#line 1190 "perly.y"
+#line 1188 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            append_elem(OP_LIST, (ps[(2) - (2)].val.opval), scalar((ps[(1) - (2)].val.opval)))); ;}
     break;
 
   case 180:
-#line 1193 "perly.y"
+#line 1191 "perly.y"
     { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), 0);
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
                        ;}
     break;
 
   case 181:
-#line 1197 "perly.y"
+#line 1195 "perly.y"
     { (yyval.opval) = newOP(IVAL((ps[(1) - (3)].val.i_tkval)), 0);
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
@@ -1413,13 +1411,13 @@ case 2:
     break;
 
   case 182:
-#line 1203 "perly.y"
+#line 1201 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                scalar((ps[(1) - (1)].val.opval))); ;}
     break;
 
   case 183:
-#line 1206 "perly.y"
+#line 1204 "perly.y"
     { (yyval.opval) = (IVAL((ps[(1) - (3)].val.i_tkval)) == OP_NOT)
                            ? newUNOP(IVAL((ps[(1) - (3)].val.i_tkval)), 0, newSVOP(OP_CONST, 0, newSViv(0)))
                            : newOP(IVAL((ps[(1) - (3)].val.i_tkval)), OPf_SPECIAL);
@@ -1431,7 +1429,7 @@ case 2:
     break;
 
   case 184:
-#line 1215 "perly.y"
+#line 1213 "perly.y"
     { (yyval.opval) = newUNOP(IVAL((ps[(1) - (4)].val.i_tkval)), 0, (ps[(3) - (4)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o');
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'(');
@@ -1440,7 +1438,7 @@ case 2:
     break;
 
   case 185:
-#line 1221 "perly.y"
+#line 1219 "perly.y"
     { (yyval.opval) = pmruntime((ps[(1) - (4)].val.opval), (ps[(3) - (4)].val.opval), 1);
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')');
@@ -1448,7 +1446,7 @@ case 2:
     break;
 
   case 188:
-#line 1231 "perly.y"
+#line 1229 "perly.y"
     { (yyval.opval) = my_attrs((ps[(2) - (3)].val.opval),(ps[(3) - (3)].val.opval));
                          DO_MAD(
                              token_getmad((ps[(1) - (3)].val.i_tkval),(yyval.opval),'d');
@@ -1459,14 +1457,14 @@ case 2:
     break;
 
   case 189:
-#line 1239 "perly.y"
+#line 1237 "perly.y"
     { (yyval.opval) = localize((ps[(2) - (2)].val.opval),IVAL((ps[(1) - (2)].val.i_tkval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'d');
                        ;}
     break;
 
   case 190:
-#line 1246 "perly.y"
+#line 1244 "perly.y"
     { (yyval.opval) = sawparens((ps[(2) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
@@ -1474,7 +1472,7 @@ case 2:
     break;
 
   case 191:
-#line 1251 "perly.y"
+#line 1249 "perly.y"
     { (yyval.opval) = sawparens(newNULLLIST());
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),')');
@@ -1482,42 +1480,42 @@ case 2:
     break;
 
   case 192:
-#line 1256 "perly.y"
+#line 1254 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 193:
-#line 1258 "perly.y"
+#line 1256 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 194:
-#line 1260 "perly.y"
+#line 1258 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 195:
-#line 1265 "perly.y"
+#line 1263 "perly.y"
     { (yyval.opval) = Nullop; ;}
     break;
 
   case 196:
-#line 1267 "perly.y"
+#line 1265 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 197:
-#line 1271 "perly.y"
+#line 1269 "perly.y"
     { (yyval.opval) = Nullop; ;}
     break;
 
   case 198:
-#line 1273 "perly.y"
+#line 1271 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 199:
-#line 1275 "perly.y"
+#line 1273 "perly.y"
     {
 #ifdef MAD
                          OP* op = newNULLLIST();
@@ -1531,69 +1529,69 @@ case 2:
     break;
 
   case 200:
-#line 1290 "perly.y"
+#line 1288 "perly.y"
     { PL_in_my = 0; (yyval.opval) = my((ps[(1) - (1)].val.opval)); ;}
     break;
 
   case 201:
-#line 1294 "perly.y"
+#line 1292 "perly.y"
     { (yyval.opval) = newCVREF(IVAL((ps[(1) - (2)].val.i_tkval)),(ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'&');
                        ;}
     break;
 
   case 202:
-#line 1300 "perly.y"
+#line 1298 "perly.y"
     { (yyval.opval) = newSVREF((ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'$');
                        ;}
     break;
 
   case 203:
-#line 1306 "perly.y"
+#line 1304 "perly.y"
     { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'@');
                        ;}
     break;
 
   case 204:
-#line 1312 "perly.y"
+#line 1310 "perly.y"
     { (yyval.opval) = newHVREF((ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'%');
                        ;}
     break;
 
   case 205:
-#line 1318 "perly.y"
+#line 1316 "perly.y"
     { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'l');
                        ;}
     break;
 
   case 206:
-#line 1324 "perly.y"
+#line 1322 "perly.y"
     { (yyval.opval) = newGVREF(0,(ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'*');
                        ;}
     break;
 
   case 207:
-#line 1331 "perly.y"
+#line 1329 "perly.y"
     { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); ;}
     break;
 
   case 208:
-#line 1333 "perly.y"
+#line 1331 "perly.y"
     { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); ;}
     break;
 
   case 209:
-#line 1335 "perly.y"
+#line 1333 "perly.y"
     { (yyval.opval) = scope((ps[(1) - (1)].val.opval)); ;}
     break;
 
   case 210:
-#line 1338 "perly.y"
+#line 1336 "perly.y"
     { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
diff --git a/perly.h b/perly.h
index 73dc4b8..f442416 100644 (file)
--- a/perly.h
+++ b/perly.h
@@ -203,7 +203,7 @@ typedef union YYSTYPE
     TOKEN* tkval;
 #endif
 }
-/* Line 1529 of yacc.c.  */
+/* Line 1489 of yacc.c.  */
        YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
index d8d672b..f376938 100644 (file)
--- a/perly.tab
+++ b/perly.tab
@@ -171,24 +171,24 @@ static const yytype_uint16 yyrline[] =
      183,   184,   191,   200,   203,   204,   206,   208,   225,   244,
      246,   248,   252,   256,   260,   264,   273,   274,   278,   289,
      297,   308,   311,   317,   318,   325,   338,   350,   361,   371,
-     381,   415,   423,   433,   439,   440,   445,   448,   452,   457,
-     461,   465,   471,   480,   484,   486,   488,   490,   492,   497,
-     501,   507,   521,   522,   526,   539,   560,   566,   571,   576,
-     586,   587,   592,   593,   597,   607,   611,   621,   622,   631,
-     645,   644,   662,   666,   670,   674,   678,   688,   697,   701,
-     706,   713,   722,   728,   734,   742,   746,   753,   752,   763,
-     764,   768,   777,   782,   790,   797,   804,   814,   823,   830,
-     839,   846,   852,   859,   869,   873,   877,   883,   887,   891,
-     895,   899,   903,   907,   919,   923,   927,   931,   941,   945,
-     952,   956,   960,   965,   970,   975,   984,   989,   994,  1000,
-    1006,  1017,  1021,  1025,  1037,  1050,  1058,  1070,  1071,  1072,
-    1073,  1074,  1079,  1083,  1085,  1089,  1094,  1099,  1101,  1103,
-    1105,  1107,  1109,  1111,  1120,  1131,  1133,  1135,  1140,  1153,
-    1158,  1163,  1167,  1171,  1175,  1179,  1183,  1185,  1187,  1189,
-    1192,  1196,  1202,  1205,  1214,  1220,  1225,  1226,  1230,  1238,
-    1245,  1250,  1255,  1257,  1259,  1264,  1266,  1271,  1272,  1274,
-    1289,  1293,  1299,  1305,  1311,  1317,  1323,  1330,  1332,  1334,
-    1337
+     381,   413,   421,   431,   437,   438,   443,   446,   450,   455,
+     459,   463,   469,   478,   482,   484,   486,   488,   490,   495,
+     499,   505,   519,   520,   524,   537,   558,   564,   569,   574,
+     584,   585,   590,   591,   595,   605,   609,   619,   620,   629,
+     643,   642,   660,   664,   668,   672,   676,   686,   695,   699,
+     704,   711,   720,   726,   732,   740,   744,   751,   750,   761,
+     762,   766,   775,   780,   788,   795,   802,   812,   821,   828,
+     837,   844,   850,   857,   867,   871,   875,   881,   885,   889,
+     893,   897,   901,   905,   917,   921,   925,   929,   939,   943,
+     950,   954,   958,   963,   968,   973,   982,   987,   992,   998,
+    1004,  1015,  1019,  1023,  1035,  1048,  1056,  1068,  1069,  1070,
+    1071,  1072,  1077,  1081,  1083,  1087,  1092,  1097,  1099,  1101,
+    1103,  1105,  1107,  1109,  1118,  1129,  1131,  1133,  1138,  1151,
+    1156,  1161,  1165,  1169,  1173,  1177,  1181,  1183,  1185,  1187,
+    1190,  1194,  1200,  1203,  1212,  1218,  1223,  1224,  1228,  1236,
+    1243,  1248,  1253,  1255,  1257,  1262,  1264,  1269,  1270,  1272,
+    1287,  1291,  1297,  1303,  1309,  1315,  1321,  1328,  1330,  1332,
+    1335
 };
 #endif
 
diff --git a/perly.y b/perly.y
index e4515da..a1f23ab 100644 (file)
--- a/perly.y
+++ b/perly.y
@@ -390,8 +390,7 @@ loop        :       label WHILE '(' remember texpr ')' mintro mblock cont
 #ifdef MAD
                          forop = newUNOP(OP_NULL, 0, append_elem(OP_LINESEQ,
                                newSTATEOP(0,
-                                          (($1)->tk_lval.pval
-                                          ?savepv(($1)->tk_lval.pval):Nullch),
+                                          CopLABEL_alloc(($1)->tk_lval.pval),
                                           ($5 ? newOP(OP_NULL, 0) : $5) ),
                                forop));
 
@@ -404,8 +403,7 @@ loop        :       label WHILE '(' remember texpr ')' mintro mblock cont
 #else
                          if ($5) {
                                forop = append_elem(OP_LINESEQ,
-                                        newSTATEOP(0, ($1?savepv($1):Nullch),
-                                                  $5),
+                                        newSTATEOP(0, CopLABEL_alloc($1), $5),
                                        forop);
                          }
 
diff --git a/toke.c b/toke.c
index 32edd1d..89d8f0b 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -5093,7 +5093,7 @@ Perl_yylex(pTHX)
        if (!tmp && PL_expect == XSTATE
              && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
            s = d + 1;
-           yylval.pval = savepv(PL_tokenbuf);
+           yylval.pval = CopLABEL_alloc(PL_tokenbuf);
            CLINE;
            TOKEN(LABEL);
        }