From 15b69c3dab6d935b7a2b50765d82cf5fb3015a75 Mon Sep 17 00:00:00 2001 From: Richard Leach Date: Tue, 14 Oct 2025 22:17:55 +0000 Subject: [PATCH 1/3] Force OPf_PARAMS on "if/elsif/unless" optree branches Previously, only `else {}` branches would have the OPf_PARAMS flag set. `Perl_op_scope` uses this flag to determine whether its optree argument (`o`) should be wrapped in an `ENTER/LEAVE` pair or only get a `SCOPE` OP, which is typically optimized away (nulled out) before runtime. This has at least two consequences visible for Perl users: 1. Differing lifetimes for things depending upon whether they occur in an `if` block or an `else` block. This could cause bugs that cannot be understood from Perl source code alone. For example, consider a `Foo` class that has a `DESTROY` sub. In the following code, `$object2` goes out of scope at the completion of the `else {}` block and the `DESTROY` sub fires. In contrast, `$object1` does NOT go out of scope at the completion of the `if {}` block - because _there is no scope_ - and the `DESTROY` sub won't fire until some later time. ``` if ($_) { my $object1 = Foo->new(); } else { my $object2 = Foo->new(); } ``` 2. The `NEXTSTATE` OP immediately following a `SCOPE` OP is typically nulled out before runtime, but the first `NEXTSTATE` after an `ENTER` OP is not. `NEXTSTATE` OPs update the interpreter with the line number associated with the currently executing statement. (`PL_curcop`.) The interpreter outputs this in warnings or fatal error messages. Not having the first `NEXTSTATE` present in `if` blocks means that error messages triggered by the first line of code will typically report an incorrect line number. This commit addresses the above two concerns, but with the downside that `if`/`elsif`/`unless` blocks now have the same OP overhead as `else` blocks. (The `ENTER`, first `NEXTSTATE`, and `LEAVE` OPs.) --- perly.act | 515 +++++++++++++++++++++++++++--------------------------- perly.h | 2 +- perly.tab | 72 ++++---- perly.y | 3 + 4 files changed, 299 insertions(+), 293 deletions(-) diff --git a/perly.act b/perly.act index 43d328ad0937..28e8e765bfaa 100644 --- a/perly.act +++ b/perly.act @@ -372,6 +372,7 @@ case 2: /* @1: %empty */ case 36: /* bare_statement_if: KW_IF PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else */ #line 531 "perly.y" { + ((ps[-1].val.opval))->op_flags |= OPf_PARENS; (yyval.opval) = block_end((ps[-4].val.ival), newCONDOP(0, (ps[-3].val.opval), op_scope((ps[-1].val.opval)), (ps[0].val.opval))); parser->copline = (line_t)(ps[-6].val.ival); } @@ -379,7 +380,7 @@ case 2: /* @1: %empty */ break; case 37: /* bare_statement_null: PERLY_SEMICOLON */ -#line 539 "perly.y" +#line 540 "perly.y" { (yyval.opval) = NULL; parser->copline = NOLINE; @@ -388,7 +389,7 @@ case 2: /* @1: %empty */ break; case 38: /* bare_statement_package_declaration: KW_PACKAGE BAREWORD BAREWORD PERLY_SEMICOLON */ -#line 555 "perly.y" +#line 556 "perly.y" { package((ps[-1].val.opval)); if ((ps[-2].val.opval)) @@ -399,7 +400,7 @@ case 2: /* @1: %empty */ break; case 39: /* $@12: %empty */ -#line 569 "perly.y" +#line 570 "perly.y" { package((ps[-2].val.opval)); if ((ps[-3].val.opval)) { @@ -410,7 +411,7 @@ case 2: /* @1: %empty */ break; case 40: /* bare_statement_package_definition: KW_PACKAGE BAREWORD BAREWORD PERLY_BRACE_OPEN remember $@12 stmtseq PERLY_BRACE_CLOSE */ -#line 577 "perly.y" +#line 578 "perly.y" { /* a block is a loop that happens once */ (yyval.opval) = newWHILEOP(0, 1, NULL, NULL, block_end((ps[-3].val.ival), (ps[-1].val.opval)), NULL, 0); @@ -421,7 +422,7 @@ case 2: /* @1: %empty */ break; case 41: /* $@13: %empty */ -#line 588 "perly.y" +#line 589 "perly.y" { switch((ps[-1].val.ival)) { case KEY_ADJUST: @@ -436,7 +437,7 @@ case 2: /* @1: %empty */ break; case 42: /* bare_statement_phaser: PHASER startsub $@13 optsubbody */ -#line 599 "perly.y" +#line 600 "perly.y" { OP *body = (ps[0].val.opval); SvREFCNT_inc_simple_void(PL_compcv); @@ -456,7 +457,7 @@ case 2: /* @1: %empty */ break; case 43: /* $@14: %empty */ -#line 623 "perly.y" +#line 624 "perly.y" { init_named_cv(PL_compcv, (ps[-1].val.opval)); if((ps[-2].val.ival) == KW_METHOD_named) { @@ -470,7 +471,7 @@ case 2: /* @1: %empty */ break; case 44: /* bare_statement_sub_signature: sigsub_or_method_named subname startsub $@14 subattrlist optsigsubbody */ -#line 634 "perly.y" +#line 635 "perly.y" { OP *body = (ps[0].val.opval); @@ -487,7 +488,7 @@ case 2: /* @1: %empty */ break; case 45: /* $@15: %empty */ -#line 653 "perly.y" +#line 654 "perly.y" { init_named_cv(PL_compcv, (ps[-1].val.opval)); parser->in_my = 0; @@ -497,7 +498,7 @@ case 2: /* @1: %empty */ break; case 46: /* bare_statement_sub_traditional: KW_SUB_named subname startsub $@15 proto subattrlist optsubbody */ -#line 661 "perly.y" +#line 662 "perly.y" { SvREFCNT_inc_simple_void(PL_compcv); (ps[-5].val.opval)->op_type == OP_CONST @@ -512,7 +513,7 @@ case 2: /* @1: %empty */ break; case 47: /* $@16: %empty */ -#line 679 "perly.y" +#line 680 "perly.y" { if(!(ps[0].val.opval)) { yyerror("catch block requires a (VAR)"); @@ -523,7 +524,7 @@ case 2: /* @1: %empty */ break; case 48: /* bare_statement_try_catch: KW_TRY mblock KW_CATCH remember catch_paren $@16 mblock finally */ -#line 687 "perly.y" +#line 688 "perly.y" { (yyval.opval) = newTRYCATCHOP(0, (ps[-6].val.opval), (ps[-3].val.opval), block_end((ps[-4].val.ival), op_scope((ps[-1].val.opval)))); if((ps[0].val.opval)) @@ -534,8 +535,9 @@ case 2: /* @1: %empty */ break; case 49: /* bare_statement_unless: KW_UNLESS PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else */ -#line 703 "perly.y" +#line 704 "perly.y" { + ((ps[-1].val.opval))->op_flags |= OPf_PARENS; (yyval.opval) = block_end((ps[-4].val.ival), newCONDOP(0, (ps[-3].val.opval), (ps[0].val.opval), op_scope((ps[-1].val.opval)))); parser->copline = (line_t)(ps[-6].val.ival); } @@ -543,7 +545,7 @@ case 2: /* @1: %empty */ break; case 50: /* bare_statement_until: KW_UNTIL PERLY_PAREN_OPEN remember iexpr PERLY_PAREN_CLOSE mintro mblock cont */ -#line 718 "perly.y" +#line 720 "perly.y" { (yyval.opval) = block_end((ps[-5].val.ival), newWHILEOP(0, 1, NULL, (ps[-4].val.opval), (ps[-1].val.opval), (ps[0].val.opval), (ps[-2].val.ival))); parser->copline = (line_t)(ps[-7].val.ival); @@ -552,13 +554,13 @@ case 2: /* @1: %empty */ break; case 51: /* $@17: %empty */ -#line 727 "perly.y" +#line 729 "perly.y" { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ } break; case 52: /* bare_statement_utilize: KW_USE_or_NO startsub $@17 BAREWORD BAREWORD optlistexpr PERLY_SEMICOLON */ -#line 734 "perly.y" +#line 736 "perly.y" { 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)); @@ -569,7 +571,7 @@ case 2: /* @1: %empty */ break; case 53: /* bare_statement_when: KW_WHEN PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock */ -#line 749 "perly.y" +#line 751 "perly.y" { (yyval.opval) = block_end((ps[-3].val.ival), newWHENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)))); } @@ -577,7 +579,7 @@ case 2: /* @1: %empty */ break; case 54: /* bare_statement_while: KW_WHILE PERLY_PAREN_OPEN remember texpr PERLY_PAREN_CLOSE mintro mblock cont */ -#line 763 "perly.y" +#line 765 "perly.y" { (yyval.opval) = block_end((ps[-5].val.ival), newWHILEOP(0, 1, NULL, (ps[-4].val.opval), (ps[-1].val.opval), (ps[0].val.opval), (ps[-2].val.ival))); parser->copline = (line_t)(ps[-7].val.ival); @@ -586,7 +588,7 @@ case 2: /* @1: %empty */ break; case 55: /* bare_statement_yadayada: YADAYADA PERLY_SEMICOLON */ -#line 771 "perly.y" +#line 773 "perly.y" { /* diag_listed_as: Unimplemented */ (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0), newSVOP(OP_CONST, 0, newSVpvs("Unimplemented"))); @@ -595,19 +597,19 @@ case 2: /* @1: %empty */ break; case 56: /* sigsub_or_method_named: KW_SUB_named_sig */ -#line 780 "perly.y" +#line 782 "perly.y" { (yyval.ival) = KW_SUB_named_sig; } break; case 57: /* sigsub_or_method_named: KW_METHOD_named */ -#line 782 "perly.y" +#line 784 "perly.y" { (yyval.ival) = KW_METHOD_named; } break; case 58: /* block: PERLY_BRACE_OPEN remember stmtseq PERLY_BRACE_CLOSE */ -#line 787 "perly.y" +#line 789 "perly.y" { 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)); @@ -616,13 +618,13 @@ case 2: /* @1: %empty */ break; case 59: /* empty: %empty */ -#line 794 "perly.y" +#line 796 "perly.y" { (yyval.opval) = NULL; } break; case 60: /* formblock: PERLY_EQUAL_SIGN remember PERLY_SEMICOLON FORMRBRACK formstmtseq PERLY_SEMICOLON PERLY_DOT */ -#line 799 "perly.y" +#line 801 "perly.y" { 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)); @@ -631,14 +633,14 @@ case 2: /* @1: %empty */ break; case 61: /* remember: %empty */ -#line 806 "perly.y" +#line 808 "perly.y" { (yyval.ival) = block_start(TRUE); parser->parsed_sub = 0; } break; case 62: /* mblock: PERLY_BRACE_OPEN mremember stmtseq PERLY_BRACE_CLOSE */ -#line 811 "perly.y" +#line 813 "perly.y" { 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)); @@ -647,32 +649,32 @@ case 2: /* @1: %empty */ break; case 63: /* mremember: %empty */ -#line 818 "perly.y" +#line 820 "perly.y" { (yyval.ival) = block_start(FALSE); parser->parsed_sub = 0; } break; case 65: /* $@18: %empty */ -#line 827 "perly.y" +#line 829 "perly.y" { parser->in_my = KEY_catch; } break; case 66: /* $@19: %empty */ -#line 829 "perly.y" +#line 831 "perly.y" { parser->in_my = 0; intro_my(); } break; case 67: /* catch_paren: PERLY_PAREN_OPEN $@18 scalar $@19 PERLY_PAREN_CLOSE */ -#line 831 "perly.y" +#line 833 "perly.y" { (yyval.opval) = (ps[-2].val.opval); } break; case 69: /* stmtseq: stmtseq fullstmt */ -#line 838 "perly.y" +#line 840 "perly.y" { (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)) @@ -682,7 +684,7 @@ case 2: /* @1: %empty */ break; case 71: /* formstmtseq: formstmtseq formline */ -#line 849 "perly.y" +#line 851 "perly.y" { (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)) @@ -692,7 +694,7 @@ case 2: /* @1: %empty */ break; case 72: /* fullstmt: barestmt */ -#line 858 "perly.y" +#line 860 "perly.y" { (yyval.opval) = (ps[0].val.opval) ? newSTATEOP(0, NULL, (ps[0].val.opval)) : NULL; } @@ -700,13 +702,13 @@ case 2: /* @1: %empty */ break; case 73: /* fullstmt: labfullstmt */ -#line 862 "perly.y" +#line 864 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 74: /* labfullstmt: LABEL barestmt */ -#line 866 "perly.y" +#line 868 "perly.y" { SV *label = cSVOPx_sv((ps[-1].val.opval)); (yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8, @@ -717,7 +719,7 @@ case 2: /* @1: %empty */ break; case 75: /* labfullstmt: LABEL labfullstmt */ -#line 873 "perly.y" +#line 875 "perly.y" { SV *label = cSVOPx_sv((ps[-1].val.opval)); (yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8, @@ -728,7 +730,7 @@ case 2: /* @1: %empty */ break; case 101: /* formline: THING formarg */ -#line 918 "perly.y" +#line 920 "perly.y" { OP *list; if ((ps[0].val.opval)) { OP *term = (ps[0].val.opval); @@ -747,62 +749,62 @@ case 2: /* @1: %empty */ break; case 103: /* formarg: FORMLBRACK stmtseq FORMRBRACK */ -#line 937 "perly.y" +#line 939 "perly.y" { (yyval.opval) = op_unscope((ps[-1].val.opval)); } break; case 105: /* sideff: error */ -#line 945 "perly.y" +#line 947 "perly.y" { (yyval.opval) = NULL; } break; case 106: /* sideff: expr */ -#line 947 "perly.y" +#line 949 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 107: /* sideff: expr KW_IF condition */ -#line 949 "perly.y" +#line 951 "perly.y" { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[0].val.opval), (ps[-2].val.opval)); } break; case 108: /* sideff: expr KW_UNLESS condition */ -#line 951 "perly.y" +#line 953 "perly.y" { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[0].val.opval), (ps[-2].val.opval)); } break; case 109: /* sideff: expr KW_WHILE condition */ -#line 953 "perly.y" +#line 955 "perly.y" { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[0].val.opval)), (ps[-2].val.opval)); } break; case 110: /* sideff: expr KW_UNTIL iexpr */ -#line 955 "perly.y" +#line 957 "perly.y" { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[0].val.opval), (ps[-2].val.opval)); } break; case 111: /* sideff: expr KW_FOR condition */ -#line 957 "perly.y" +#line 959 "perly.y" { (yyval.opval) = newFOROP(0, NULL, (ps[0].val.opval), (ps[-2].val.opval), NULL); parser->copline = (line_t)(ps[-1].val.ival); } break; case 112: /* sideff: expr KW_WHEN condition */ -#line 960 "perly.y" +#line 962 "perly.y" { (yyval.opval) = newWHENOP((ps[0].val.opval), op_scope((ps[-2].val.opval))); } break; case 114: /* else: KW_ELSE mblock */ -#line 967 "perly.y" +#line 969 "perly.y" { ((ps[0].val.opval))->op_flags |= OPf_PARENS; (yyval.opval) = op_scope((ps[0].val.opval)); @@ -811,8 +813,9 @@ case 2: /* @1: %empty */ break; case 115: /* else: KW_ELSIF PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock else */ -#line 972 "perly.y" +#line 974 "perly.y" { parser->copline = (line_t)(ps[-5].val.ival); + ((ps[-1].val.opval))->op_flags |= OPf_PARENS; (yyval.opval) = newCONDOP(0, newSTATEOP(OPf_SPECIAL,NULL,(ps[-3].val.opval)), op_scope((ps[-1].val.opval)), (ps[0].val.opval)); @@ -822,25 +825,25 @@ case 2: /* @1: %empty */ break; case 117: /* cont: KW_CONTINUE block */ -#line 984 "perly.y" +#line 987 "perly.y" { (yyval.opval) = op_scope((ps[0].val.opval)); } break; case 118: /* finally: %empty */ -#line 989 "perly.y" +#line 992 "perly.y" { (yyval.opval) = NULL; } break; case 119: /* finally: KW_FINALLY block */ -#line 991 "perly.y" +#line 994 "perly.y" { (yyval.opval) = op_scope((ps[0].val.opval)); } break; case 120: /* mintro: %empty */ -#line 996 "perly.y" +#line 999 "perly.y" { (yyval.ival) = (PL_min_intro_pending && PL_max_intro_pending >= PL_min_intro_pending); intro_my(); } @@ -848,7 +851,7 @@ case 2: /* @1: %empty */ break; case 123: /* texpr: %empty */ -#line 1008 "perly.y" +#line 1011 "perly.y" { YYSTYPE tmplval; (void)scan_num("1", &tmplval); (yyval.opval) = tmplval.opval; } @@ -856,59 +859,59 @@ case 2: /* @1: %empty */ break; case 125: /* iexpr: expr */ -#line 1016 "perly.y" +#line 1019 "perly.y" { (yyval.opval) = invert(scalar((ps[0].val.opval))); } break; case 126: /* mexpr: expr */ -#line 1021 "perly.y" +#line 1024 "perly.y" { (yyval.opval) = (ps[0].val.opval); intro_my(); } break; case 127: /* mnexpr: nexpr */ -#line 1025 "perly.y" +#line 1028 "perly.y" { (yyval.opval) = (ps[0].val.opval); intro_my(); } break; case 128: /* formname: BAREWORD */ -#line 1028 "perly.y" +#line 1031 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 130: /* startsub: %empty */ -#line 1033 "perly.y" +#line 1036 "perly.y" { (yyval.ival) = start_subparse(FALSE, 0); SAVEFREESV(PL_compcv); } break; case 131: /* startanonsub: %empty */ -#line 1039 "perly.y" +#line 1042 "perly.y" { (yyval.ival) = start_subparse(FALSE, CVf_ANON); SAVEFREESV(PL_compcv); } break; case 132: /* startanonmethod: %empty */ -#line 1044 "perly.y" +#line 1047 "perly.y" { (yyval.ival) = start_subparse(FALSE, CVf_ANON|CVf_IsMETHOD); SAVEFREESV(PL_compcv); } break; case 133: /* startformsub: %empty */ -#line 1049 "perly.y" +#line 1052 "perly.y" { (yyval.ival) = start_subparse(TRUE, 0); SAVEFREESV(PL_compcv); } break; case 139: /* subattrlist: COLONATTR THING */ -#line 1068 "perly.y" +#line 1071 "perly.y" { OP *attrlist = (ps[0].val.opval); if(attrlist && !PL_parser->sig_seen) @@ -919,49 +922,49 @@ case 2: /* @1: %empty */ break; case 140: /* subattrlist: COLONATTR */ -#line 1075 "perly.y" +#line 1078 "perly.y" { (yyval.opval) = NULL; } break; case 141: /* myattrlist: COLONATTR THING */ -#line 1080 "perly.y" +#line 1083 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 142: /* myattrlist: COLONATTR */ -#line 1082 "perly.y" +#line 1085 "perly.y" { (yyval.opval) = NULL; } break; case 143: /* sigvar: %empty */ -#line 1093 "perly.y" +#line 1096 "perly.y" { parser->in_my = 0; (yyval.ival) = 0; } break; case 144: /* sigvar: PRIVATEREF */ -#line 1095 "perly.y" +#line 1098 "perly.y" { parser->in_my = 0; (yyval.ival) = (ps[0].val.opval)->op_targ; op_free((ps[0].val.opval)); } break; case 145: /* sigslurpsigil: PERLY_SNAIL */ -#line 1100 "perly.y" +#line 1103 "perly.y" { (yyval.ival) = '@'; } break; case 146: /* sigslurpsigil: PERLY_PERCENT_SIGN */ -#line 1102 "perly.y" +#line 1105 "perly.y" { (yyval.ival) = '%'; } break; case 147: /* sigslurpelem: sigslurpsigil sigvar */ -#line 1106 "perly.y" +#line 1109 "perly.y" { subsignature_append_slurpy((ps[-1].val.ival), (ps[0].val.ival)); (yyval.opval) = NULL; @@ -970,7 +973,7 @@ case 2: /* @1: %empty */ break; case 148: /* sigslurpelem: sigslurpsigil sigvar ASSIGNOP */ -#line 1111 "perly.y" +#line 1114 "perly.y" { yyerror("A slurpy parameter may not have a default value"); } @@ -978,7 +981,7 @@ case 2: /* @1: %empty */ break; case 149: /* sigslurpelem: sigslurpsigil sigvar ASSIGNOP term */ -#line 1115 "perly.y" +#line 1118 "perly.y" { yyerror("A slurpy parameter may not have a default value"); } @@ -986,7 +989,7 @@ case 2: /* @1: %empty */ break; case 150: /* sigscalarelem: PERLY_DOLLAR sigvar */ -#line 1123 "perly.y" +#line 1126 "perly.y" { subsignature_append_positional((ps[0].val.ival), 0, NULL); (yyval.opval) = NULL; @@ -995,7 +998,7 @@ case 2: /* @1: %empty */ break; case 151: /* sigscalarelem: PERLY_DOLLAR sigvar ASSIGNOP optsigscalardefault */ -#line 1128 "perly.y" +#line 1131 "perly.y" { subsignature_append_positional((ps[-2].val.ival), (ps[-1].val.ival), (ps[0].val.opval)); (yyval.opval) = NULL; @@ -1004,31 +1007,31 @@ case 2: /* @1: %empty */ break; case 152: /* optsigscalardefault: %empty */ -#line 1136 "perly.y" +#line 1139 "perly.y" { (yyval.opval) = newOP(OP_NULL, 0); } break; case 154: /* sigelem: sigscalarelem */ -#line 1143 "perly.y" +#line 1146 "perly.y" { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); } break; case 155: /* sigelem: sigslurpelem */ -#line 1145 "perly.y" +#line 1148 "perly.y" { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); } break; case 163: /* subsignature: PERLY_PAREN_OPEN subsigguts PERLY_PAREN_CLOSE */ -#line 1171 "perly.y" +#line 1174 "perly.y" { (yyval.opval) = (ps[-1].val.opval); } break; case 164: /* $@20: %empty */ -#line 1174 "perly.y" +#line 1177 "perly.y" { ENTER; subsignature_start(); @@ -1038,7 +1041,7 @@ case 2: /* @1: %empty */ break; case 165: /* subsigguts: $@20 optsiglist */ -#line 1180 "perly.y" +#line 1183 "perly.y" { if (!FEATURE_SIGNATURES_IS_ENABLED && !CvIsMETHOD(PL_compcv)) croak("Experimental " @@ -1066,13 +1069,13 @@ case 2: /* @1: %empty */ break; case 167: /* optsubbody: PERLY_SEMICOLON */ -#line 1208 "perly.y" +#line 1211 "perly.y" { (yyval.opval) = NULL; } break; case 168: /* subbody: remember PERLY_BRACE_OPEN stmtseq PERLY_BRACE_CLOSE */ -#line 1214 "perly.y" +#line 1217 "perly.y" { if (parser->copline > (line_t)(ps[-2].val.ival)) parser->copline = (line_t)(ps[-2].val.ival); @@ -1082,19 +1085,19 @@ case 2: /* @1: %empty */ break; case 170: /* optsigsubbody: PERLY_SEMICOLON */ -#line 1226 "perly.y" +#line 1229 "perly.y" { (yyval.opval) = NULL; } break; case 171: /* $@21: %empty */ -#line 1231 "perly.y" +#line 1234 "perly.y" { PL_parser->sig_seen = FALSE; } break; case 172: /* sigsubbody: remember optsubsignature PERLY_BRACE_OPEN $@21 stmtseq PERLY_BRACE_CLOSE */ -#line 1233 "perly.y" +#line 1236 "perly.y" { if (parser->copline > (line_t)(ps[-3].val.ival)) parser->copline = (line_t)(ps[-3].val.ival); @@ -1105,37 +1108,37 @@ case 2: /* @1: %empty */ break; case 173: /* expr: expr ANDOP expr */ -#line 1244 "perly.y" +#line 1247 "perly.y" { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; case 174: /* expr: expr PLUGIN_LOGICAL_AND_LOW_OP expr */ -#line 1246 "perly.y" +#line 1249 "perly.y" { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; case 175: /* expr: expr OROP expr */ -#line 1248 "perly.y" +#line 1251 "perly.y" { (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; case 176: /* expr: expr PLUGIN_LOGICAL_OR_LOW_OP expr */ -#line 1250 "perly.y" +#line 1253 "perly.y" { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; case 178: /* listexpr: listexpr PERLY_COMMA */ -#line 1256 "perly.y" +#line 1259 "perly.y" { (yyval.opval) = (ps[-1].val.opval); } break; case 179: /* listexpr: listexpr PERLY_COMMA term */ -#line 1258 "perly.y" +#line 1261 "perly.y" { OP* term = (ps[0].val.opval); (yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), term); @@ -1144,7 +1147,7 @@ case 2: /* @1: %empty */ break; case 181: /* listop: LSTOP indirob listexpr */ -#line 1267 "perly.y" +#line 1270 "perly.y" { (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)) ); } @@ -1152,7 +1155,7 @@ case 2: /* @1: %empty */ break; case 182: /* listop: BLKLSTOP block listexpr */ -#line 1271 "perly.y" +#line 1274 "perly.y" { (yyval.opval) = op_convert_list((ps[-2].val.ival), OPf_STACKED, op_prepend_elem(OP_LIST, newUNOP(OP_NULL, 0, op_scope((ps[-1].val.opval))), (ps[0].val.opval)) ); } @@ -1160,7 +1163,7 @@ case 2: /* @1: %empty */ break; case 183: /* listop: FUNC PERLY_PAREN_OPEN indirob expr PERLY_PAREN_CLOSE */ -#line 1275 "perly.y" +#line 1278 "perly.y" { (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)) ); } @@ -1168,7 +1171,7 @@ case 2: /* @1: %empty */ break; case 184: /* listop: term ARROW methodname PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE */ -#line 1279 "perly.y" +#line 1282 "perly.y" { (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)), @@ -1178,7 +1181,7 @@ case 2: /* @1: %empty */ break; case 185: /* listop: term ARROW methodname */ -#line 1285 "perly.y" +#line 1288 "perly.y" { (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)))); @@ -1187,7 +1190,7 @@ case 2: /* @1: %empty */ break; case 186: /* listop: term ARROW PERLY_AMPERSAND subname PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE */ -#line 1290 "perly.y" +#line 1293 "perly.y" { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, scalar((ps[-6].val.opval)), (ps[-1].val.opval)), @@ -1197,7 +1200,7 @@ case 2: /* @1: %empty */ break; case 187: /* listop: term ARROW PERLY_AMPERSAND subname */ -#line 1296 "perly.y" +#line 1299 "perly.y" { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, scalar((ps[-3].val.opval)), @@ -1207,7 +1210,7 @@ case 2: /* @1: %empty */ break; case 188: /* listop: METHCALL0 indirob optlistexpr */ -#line 1302 "perly.y" +#line 1305 "perly.y" { (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)), @@ -1217,7 +1220,7 @@ case 2: /* @1: %empty */ break; case 189: /* listop: METHCALL indirob PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE */ -#line 1308 "perly.y" +#line 1311 "perly.y" { (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)), @@ -1227,25 +1230,25 @@ case 2: /* @1: %empty */ break; case 190: /* listop: LSTOP optlistexpr */ -#line 1314 "perly.y" +#line 1317 "perly.y" { (yyval.opval) = op_convert_list((ps[-1].val.ival), 0, (ps[0].val.opval)); } break; case 191: /* listop: FUNC PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE */ -#line 1316 "perly.y" +#line 1319 "perly.y" { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); } break; case 192: /* listop: FUNC SUBLEXSTART optexpr SUBLEXEND */ -#line 1318 "perly.y" +#line 1321 "perly.y" { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); } break; case 193: /* @22: %empty */ -#line 1320 "perly.y" +#line 1323 "perly.y" { SvREFCNT_inc_simple_void(PL_compcv); (yyval.opval) = newANONATTRSUB((ps[-1].val.ival), 0, NULL, (ps[0].val.opval)); /* prevent double op_free() if the following fails to parse */ @@ -1255,7 +1258,7 @@ case 2: /* @1: %empty */ break; case 194: /* listop: LSTOPSUB startanonsub block @22 optlistexpr */ -#line 1326 "perly.y" +#line 1329 "perly.y" { (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))); @@ -1264,20 +1267,20 @@ case 2: /* @1: %empty */ break; case 197: /* subscripted: gelem PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE */ -#line 1341 "perly.y" +#line 1344 "perly.y" { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[-4].val.opval), scalar((ps[-2].val.opval))); } break; case 198: /* subscripted: scalar PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */ -#line 1343 "perly.y" +#line 1346 "perly.y" { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[-3].val.opval)), scalar((ps[-1].val.opval))); } break; case 199: /* subscripted: term ARROW PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */ -#line 1346 "perly.y" +#line 1349 "perly.y" { (yyval.opval) = newBINOP(OP_AELEM, 0, ref(newAVREF((ps[-4].val.opval)),OP_RV2AV), scalar((ps[-1].val.opval))); @@ -1286,7 +1289,7 @@ case 2: /* @1: %empty */ break; case 200: /* subscripted: subscripted PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */ -#line 1351 "perly.y" +#line 1354 "perly.y" { (yyval.opval) = newBINOP(OP_AELEM, 0, ref(newAVREF((ps[-3].val.opval)),OP_RV2AV), scalar((ps[-1].val.opval))); @@ -1295,14 +1298,14 @@ case 2: /* @1: %empty */ break; case 201: /* subscripted: scalar PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE */ -#line 1356 "perly.y" +#line 1359 "perly.y" { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[-4].val.opval)), jmaybe((ps[-2].val.opval))); } break; case 202: /* subscripted: term ARROW PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE */ -#line 1359 "perly.y" +#line 1362 "perly.y" { (yyval.opval) = newBINOP(OP_HELEM, 0, ref(newHVREF((ps[-5].val.opval)),OP_RV2HV), jmaybe((ps[-2].val.opval))); } @@ -1310,7 +1313,7 @@ case 2: /* @1: %empty */ break; case 203: /* subscripted: subscripted PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE */ -#line 1363 "perly.y" +#line 1366 "perly.y" { (yyval.opval) = newBINOP(OP_HELEM, 0, ref(newHVREF((ps[-4].val.opval)),OP_RV2HV), jmaybe((ps[-2].val.opval))); } @@ -1318,7 +1321,7 @@ case 2: /* @1: %empty */ break; case 204: /* subscripted: term ARROW PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */ -#line 1367 "perly.y" +#line 1370 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, newCVREF(0, scalar((ps[-3].val.opval)))); if (parser->expect == XBLOCK) @@ -1328,7 +1331,7 @@ case 2: /* @1: %empty */ break; case 205: /* subscripted: term ARROW PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE */ -#line 1373 "perly.y" +#line 1376 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[-1].val.opval), newCVREF(0, scalar((ps[-4].val.opval))))); @@ -1339,7 +1342,7 @@ case 2: /* @1: %empty */ break; case 206: /* subscripted: subscripted PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE */ -#line 1381 "perly.y" +#line 1384 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[-1].val.opval), newCVREF(0, scalar((ps[-3].val.opval))))); @@ -1350,7 +1353,7 @@ case 2: /* @1: %empty */ break; case 207: /* subscripted: subscripted PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */ -#line 1388 "perly.y" +#line 1391 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, newCVREF(0, scalar((ps[-2].val.opval)))); if (parser->expect == XBLOCK) @@ -1360,55 +1363,55 @@ case 2: /* @1: %empty */ break; case 208: /* subscripted: PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */ -#line 1394 "perly.y" +#line 1397 "perly.y" { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-4].val.opval)); } break; case 209: /* subscripted: QWLIST PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */ -#line 1396 "perly.y" +#line 1399 "perly.y" { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-3].val.opval)); } break; case 210: /* subscripted: PERLY_PAREN_OPEN PERLY_PAREN_CLOSE PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */ -#line 1398 "perly.y" +#line 1401 "perly.y" { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), NULL); } break; case 211: /* termbinop: term PLUGIN_HIGH_OP term */ -#line 1403 "perly.y" +#line 1406 "perly.y" { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; case 212: /* termbinop: term ASSIGNOP term */ -#line 1405 "perly.y" +#line 1408 "perly.y" { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[-2].val.opval), (ps[-1].val.ival), (ps[0].val.opval)); } break; case 213: /* termbinop: term PLUGIN_ASSIGN_OP term */ -#line 1407 "perly.y" +#line 1410 "perly.y" { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; case 214: /* termbinop: term POWOP term */ -#line 1409 "perly.y" +#line 1412 "perly.y" { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 215: /* termbinop: term PLUGIN_POW_OP term */ -#line 1411 "perly.y" +#line 1414 "perly.y" { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; case 216: /* termbinop: term MULOP term */ -#line 1413 "perly.y" +#line 1416 "perly.y" { 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))); @@ -1417,219 +1420,219 @@ case 2: /* @1: %empty */ break; case 217: /* termbinop: term PLUGIN_MUL_OP term */ -#line 1418 "perly.y" +#line 1421 "perly.y" { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; case 218: /* termbinop: term ADDOP term */ -#line 1420 "perly.y" +#line 1423 "perly.y" { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 219: /* termbinop: term PLUGIN_ADD_OP term */ -#line 1422 "perly.y" +#line 1425 "perly.y" { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; case 220: /* termbinop: term SHIFTOP term */ -#line 1424 "perly.y" +#line 1427 "perly.y" { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 221: /* termbinop: termrelop */ -#line 1426 "perly.y" +#line 1429 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 222: /* termbinop: termeqop */ -#line 1428 "perly.y" +#line 1431 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 223: /* termbinop: term BITANDOP term */ -#line 1430 "perly.y" +#line 1433 "perly.y" { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 224: /* termbinop: term BITOROP term */ -#line 1432 "perly.y" +#line 1435 "perly.y" { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 225: /* termbinop: term DOTDOT term */ -#line 1434 "perly.y" +#line 1437 "perly.y" { (yyval.opval) = newRANGE((ps[-1].val.ival), scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 226: /* termbinop: term ANDAND term */ -#line 1436 "perly.y" +#line 1439 "perly.y" { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; case 227: /* termbinop: term PLUGIN_LOGICAL_AND_OP term */ -#line 1438 "perly.y" +#line 1441 "perly.y" { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; case 228: /* termbinop: term OROR term */ -#line 1440 "perly.y" +#line 1443 "perly.y" { (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; case 229: /* termbinop: term PLUGIN_LOGICAL_OR_OP term */ -#line 1442 "perly.y" +#line 1445 "perly.y" { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; case 230: /* termbinop: term DORDOR term */ -#line 1444 "perly.y" +#line 1447 "perly.y" { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; case 231: /* termbinop: term MATCHOP term */ -#line 1446 "perly.y" +#line 1449 "perly.y" { (yyval.opval) = bind_match((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } break; case 232: /* termbinop: term PLUGIN_LOW_OP term */ -#line 1448 "perly.y" +#line 1451 "perly.y" { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; case 233: /* termrelop: relopchain */ -#line 1452 "perly.y" +#line 1455 "perly.y" { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); } break; case 234: /* termrelop: term NCRELOP term */ -#line 1454 "perly.y" +#line 1457 "perly.y" { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 235: /* termrelop: termrelop NCRELOP */ -#line 1456 "perly.y" +#line 1459 "perly.y" { yyerror("syntax error"); YYERROR; } break; case 236: /* termrelop: termrelop CHRELOP */ -#line 1458 "perly.y" +#line 1461 "perly.y" { yyerror("syntax error"); YYERROR; } break; case 237: /* termrelop: term PLUGIN_REL_OP term */ -#line 1460 "perly.y" +#line 1463 "perly.y" { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; case 238: /* relopchain: term CHRELOP term */ -#line 1464 "perly.y" +#line 1467 "perly.y" { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } break; case 239: /* relopchain: relopchain CHRELOP term */ -#line 1466 "perly.y" +#line 1469 "perly.y" { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } break; case 240: /* termeqop: eqopchain */ -#line 1470 "perly.y" +#line 1473 "perly.y" { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); } break; case 241: /* termeqop: term NCEQOP term */ -#line 1472 "perly.y" +#line 1475 "perly.y" { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; case 242: /* termeqop: termeqop NCEQOP */ -#line 1474 "perly.y" +#line 1477 "perly.y" { yyerror("syntax error"); YYERROR; } break; case 243: /* termeqop: termeqop CHEQOP */ -#line 1476 "perly.y" +#line 1479 "perly.y" { yyerror("syntax error"); YYERROR; } break; case 244: /* eqopchain: term CHEQOP term */ -#line 1480 "perly.y" +#line 1483 "perly.y" { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } break; case 245: /* eqopchain: eqopchain CHEQOP term */ -#line 1482 "perly.y" +#line 1485 "perly.y" { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } break; case 246: /* termunop: PERLY_MINUS term */ -#line 1487 "perly.y" +#line 1490 "perly.y" { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[0].val.opval))); } break; case 247: /* termunop: PERLY_PLUS term */ -#line 1489 "perly.y" +#line 1492 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 248: /* termunop: PERLY_EXCLAMATION_MARK term */ -#line 1492 "perly.y" +#line 1495 "perly.y" { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); } break; case 249: /* termunop: PERLY_TILDE term */ -#line 1494 "perly.y" +#line 1497 "perly.y" { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, scalar((ps[0].val.opval))); } break; case 250: /* termunop: term POSTINC */ -#line 1496 "perly.y" +#line 1499 "perly.y" { (yyval.opval) = newUNOP(OP_POSTINC, 0, op_lvalue(scalar((ps[-1].val.opval)), OP_POSTINC)); } break; case 251: /* termunop: term POSTDEC */ -#line 1499 "perly.y" +#line 1502 "perly.y" { (yyval.opval) = newUNOP(OP_POSTDEC, 0, op_lvalue(scalar((ps[-1].val.opval)), OP_POSTDEC));} break; case 252: /* termunop: term POSTJOIN */ -#line 1502 "perly.y" +#line 1505 "perly.y" { (yyval.opval) = op_convert_list(OP_JOIN, 0, op_append_elem( OP_LIST, @@ -1644,59 +1647,59 @@ case 2: /* @1: %empty */ break; case 253: /* termunop: PREINC term */ -#line 1513 "perly.y" +#line 1516 "perly.y" { (yyval.opval) = newUNOP(OP_PREINC, 0, op_lvalue(scalar((ps[0].val.opval)), OP_PREINC)); } break; case 254: /* termunop: PREDEC term */ -#line 1516 "perly.y" +#line 1519 "perly.y" { (yyval.opval) = newUNOP(OP_PREDEC, 0, op_lvalue(scalar((ps[0].val.opval)), OP_PREDEC)); } break; case 255: /* anonymous: PERLY_BRACKET_OPEN optexpr PERLY_BRACKET_CLOSE */ -#line 1524 "perly.y" +#line 1527 "perly.y" { (yyval.opval) = newANONLIST((ps[-1].val.opval)); } break; case 256: /* anonymous: HASHBRACK optexpr PERLY_SEMICOLON PERLY_BRACE_CLOSE */ -#line 1526 "perly.y" +#line 1529 "perly.y" { (yyval.opval) = newANONHASH((ps[-2].val.opval)); } break; case 257: /* anonymous: KW_SUB_anon startanonsub proto subattrlist subbody */ -#line 1528 "perly.y" +#line 1531 "perly.y" { 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 258: /* anonymous: KW_SUB_anon startanonsub proto subattrlist */ -#line 1531 "perly.y" +#line 1534 "perly.y" { yyerror("Illegal declaration of anonymous subroutine"); YYERROR; } break; case 259: /* anonymous: KW_SUB_anon_sig startanonsub subattrlist sigsubbody */ -#line 1533 "perly.y" +#line 1536 "perly.y" { SvREFCNT_inc_simple_void(PL_compcv); (yyval.opval) = newANONATTRSUB((ps[-2].val.ival), NULL, (ps[-1].val.opval), (ps[0].val.opval)); } break; case 260: /* anonymous: KW_SUB_anon_sig startanonsub subattrlist */ -#line 1536 "perly.y" +#line 1539 "perly.y" { yyerror("Illegal declaration of anonymous subroutine"); YYERROR; } break; case 261: /* anonymous: KW_METHOD_anon startanonmethod subattrlist sigsubbody */ -#line 1538 "perly.y" +#line 1541 "perly.y" { SvREFCNT_inc_simple_void(PL_compcv); (yyval.opval) = newANONATTRSUB((ps[-2].val.ival), NULL, (ps[-1].val.opval), (ps[0].val.opval)); @@ -1705,103 +1708,103 @@ case 2: /* @1: %empty */ break; case 262: /* anonymous: KW_METHOD_anon startanonmethod subattrlist */ -#line 1543 "perly.y" +#line 1546 "perly.y" { yyerror("Illegal declaration of anonymous subroutine"); YYERROR; } break; case 263: /* termdo: KW_DO term */ -#line 1548 "perly.y" +#line 1551 "perly.y" { (yyval.opval) = dofile((ps[0].val.opval), (ps[-1].val.ival));} break; case 264: /* termdo: KW_DO block */ -#line 1550 "perly.y" +#line 1553 "perly.y" { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[0].val.opval)));} break; case 269: /* term: term PERLY_QUESTION_MARK term PERLY_COLON term */ -#line 1558 "perly.y" +#line 1561 "perly.y" { (yyval.opval) = newCONDOP(0, (ps[-4].val.opval), (ps[-2].val.opval), (ps[0].val.opval)); } break; case 270: /* term: REFGEN term */ -#line 1560 "perly.y" +#line 1563 "perly.y" { (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[0].val.opval)); } break; case 271: /* term: myattrterm */ -#line 1562 "perly.y" +#line 1565 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 272: /* term: KW_LOCAL term */ -#line 1564 "perly.y" +#line 1567 "perly.y" { (yyval.opval) = localize((ps[0].val.opval),0); } break; case 273: /* term: PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE */ -#line 1566 "perly.y" +#line 1569 "perly.y" { (yyval.opval) = sawparens((ps[-1].val.opval)); } break; case 274: /* term: QWLIST */ -#line 1568 "perly.y" +#line 1571 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 275: /* term: PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */ -#line 1570 "perly.y" +#line 1573 "perly.y" { (yyval.opval) = sawparens(newNULLLIST()); } break; case 276: /* term: scalar */ -#line 1572 "perly.y" +#line 1575 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 277: /* term: star */ -#line 1574 "perly.y" +#line 1577 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 278: /* term: hsh */ -#line 1576 "perly.y" +#line 1579 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 279: /* term: ary */ -#line 1578 "perly.y" +#line 1581 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 280: /* term: arylen */ -#line 1580 "perly.y" +#line 1583 "perly.y" { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[0].val.opval), OP_AV2ARYLEN));} break; case 281: /* term: subscripted */ -#line 1582 "perly.y" +#line 1585 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 282: /* term: sliceme PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */ -#line 1584 "perly.y" +#line 1587 "perly.y" { (yyval.opval) = op_prepend_elem(OP_ASLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_ASLICE, 0, @@ -1815,7 +1818,7 @@ case 2: /* @1: %empty */ break; case 283: /* term: kvslice PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */ -#line 1594 "perly.y" +#line 1597 "perly.y" { (yyval.opval) = op_prepend_elem(OP_KVASLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_KVASLICE, 0, @@ -1829,7 +1832,7 @@ case 2: /* @1: %empty */ break; case 284: /* term: sliceme PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE */ -#line 1604 "perly.y" +#line 1607 "perly.y" { (yyval.opval) = op_prepend_elem(OP_HSLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_HSLICE, 0, @@ -1843,7 +1846,7 @@ case 2: /* @1: %empty */ break; case 285: /* term: kvslice PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE */ -#line 1614 "perly.y" +#line 1617 "perly.y" { (yyval.opval) = op_prepend_elem(OP_KVHSLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_KVHSLICE, 0, @@ -1857,26 +1860,26 @@ case 2: /* @1: %empty */ break; case 286: /* term: THING */ -#line 1624 "perly.y" +#line 1627 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 287: /* term: amper */ -#line 1626 "perly.y" +#line 1629 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[0].val.opval))); } break; case 288: /* term: amper PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */ -#line 1628 "perly.y" +#line 1631 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[-2].val.opval))); } break; case 289: /* term: amper PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE */ -#line 1631 "perly.y" +#line 1634 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[-1].val.opval), scalar((ps[-3].val.opval)))); @@ -1885,7 +1888,7 @@ case 2: /* @1: %empty */ break; case 290: /* term: NOAMP subname optlistexpr */ -#line 1636 "perly.y" +#line 1639 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval)))); } @@ -1893,130 +1896,130 @@ case 2: /* @1: %empty */ break; case 291: /* term: term ARROW PERLY_DOLLAR PERLY_STAR */ -#line 1640 "perly.y" +#line 1643 "perly.y" { (yyval.opval) = newSVREF((ps[-3].val.opval)); } break; case 292: /* term: term ARROW PERLY_SNAIL PERLY_STAR */ -#line 1642 "perly.y" +#line 1645 "perly.y" { (yyval.opval) = newAVREF((ps[-3].val.opval)); } break; case 293: /* term: term ARROW PERLY_PERCENT_SIGN PERLY_STAR */ -#line 1644 "perly.y" +#line 1647 "perly.y" { (yyval.opval) = newHVREF((ps[-3].val.opval)); } break; case 294: /* term: term ARROW PERLY_AMPERSAND PERLY_STAR */ -#line 1646 "perly.y" +#line 1649 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar(newCVREF((ps[-1].val.ival),(ps[-3].val.opval)))); } break; case 295: /* term: term ARROW PERLY_STAR PERLY_STAR */ -#line 1649 "perly.y" +#line 1652 "perly.y" { (yyval.opval) = newGVREF(0,(ps[-3].val.opval)); } break; case 296: /* term: LOOPEX */ -#line 1651 "perly.y" +#line 1654 "perly.y" { (yyval.opval) = newOP((ps[0].val.ival), OPf_SPECIAL); PL_hints |= HINT_BLOCK_SCOPE; } break; case 297: /* term: LOOPEX term */ -#line 1654 "perly.y" +#line 1657 "perly.y" { (yyval.opval) = newLOOPEX((ps[-1].val.ival),(ps[0].val.opval)); } break; case 298: /* term: NOTOP listexpr */ -#line 1656 "perly.y" +#line 1659 "perly.y" { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); } break; case 299: /* term: UNIOP */ -#line 1658 "perly.y" +#line 1661 "perly.y" { (yyval.opval) = newOP((ps[0].val.ival), 0); } break; case 300: /* term: UNIOP block */ -#line 1660 "perly.y" +#line 1663 "perly.y" { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); } break; case 301: /* term: UNIOP term */ -#line 1662 "perly.y" +#line 1665 "perly.y" { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); } break; case 302: /* term: KW_REQUIRE */ -#line 1664 "perly.y" +#line 1667 "perly.y" { (yyval.opval) = newOP(OP_REQUIRE, (ps[0].val.ival) ? OPf_SPECIAL : 0); } break; case 303: /* term: KW_REQUIRE term */ -#line 1666 "perly.y" +#line 1669 "perly.y" { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[-1].val.ival) ? OPf_SPECIAL : 0, (ps[0].val.opval)); } break; case 304: /* term: UNIOPSUB */ -#line 1668 "perly.y" +#line 1671 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); } break; case 305: /* term: UNIOPSUB term */ -#line 1670 "perly.y" +#line 1673 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval)))); } break; case 306: /* term: FUNC0 */ -#line 1673 "perly.y" +#line 1676 "perly.y" { (yyval.opval) = newOP((ps[0].val.ival), 0); } break; case 307: /* term: FUNC0 PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */ -#line 1675 "perly.y" +#line 1678 "perly.y" { (yyval.opval) = newOP((ps[-2].val.ival), 0);} break; case 308: /* term: FUNC0OP */ -#line 1677 "perly.y" +#line 1680 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 309: /* term: FUNC0OP PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */ -#line 1679 "perly.y" +#line 1682 "perly.y" { (yyval.opval) = (ps[-2].val.opval); } break; case 310: /* term: FUNC0SUB */ -#line 1681 "perly.y" +#line 1684 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); } break; case 311: /* term: FUNC1 PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */ -#line 1683 "perly.y" +#line 1686 "perly.y" { (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); } @@ -2024,13 +2027,13 @@ case 2: /* @1: %empty */ break; case 312: /* term: FUNC1 PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE */ -#line 1687 "perly.y" +#line 1690 "perly.y" { (yyval.opval) = newUNOP((ps[-3].val.ival), 0, (ps[-1].val.opval)); } break; case 313: /* @23: %empty */ -#line 1689 "perly.y" +#line 1692 "perly.y" { if ( (ps[0].val.opval)->op_type != OP_TRANS && (ps[0].val.opval)->op_type != OP_TRANSR @@ -2045,67 +2048,67 @@ case 2: /* @1: %empty */ break; case 314: /* term: PMFUNC @23 SUBLEXSTART listexpr optrepl SUBLEXEND */ -#line 1700 "perly.y" +#line 1703 "perly.y" { (yyval.opval) = pmruntime((ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), 1, (ps[-4].val.ival)); } break; case 318: /* myattrterm: KW_MY myterm myattrlist */ -#line 1709 "perly.y" +#line 1712 "perly.y" { (yyval.opval) = my_attrs((ps[-1].val.opval),(ps[0].val.opval)); } break; case 319: /* myattrterm: KW_MY myterm */ -#line 1711 "perly.y" +#line 1714 "perly.y" { (yyval.opval) = localize((ps[0].val.opval),1); } break; case 320: /* myattrterm: KW_MY REFGEN myterm myattrlist */ -#line 1713 "perly.y" +#line 1716 "perly.y" { (yyval.opval) = newUNOP(OP_REFGEN, 0, my_attrs((ps[-1].val.opval),(ps[0].val.opval))); } break; case 321: /* myattrterm: KW_MY REFGEN term */ -#line 1715 "perly.y" +#line 1718 "perly.y" { (yyval.opval) = newUNOP(OP_REFGEN, 0, localize((ps[0].val.opval),1)); } break; case 322: /* myterm: PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE */ -#line 1720 "perly.y" +#line 1723 "perly.y" { (yyval.opval) = sawparens((ps[-1].val.opval)); } break; case 323: /* myterm: PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */ -#line 1722 "perly.y" +#line 1725 "perly.y" { (yyval.opval) = sawparens(newNULLLIST()); } break; case 324: /* myterm: scalar */ -#line 1725 "perly.y" +#line 1728 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 325: /* myterm: hsh */ -#line 1727 "perly.y" +#line 1730 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 326: /* myterm: ary */ -#line 1729 "perly.y" +#line 1732 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 327: /* fieldvar: scalar */ -#line 1734 "perly.y" +#line 1737 "perly.y" { (yyval.pval) = PadnamelistARRAY(PL_comppad_name)[(ps[0].val.opval)->op_targ]; op_free((ps[0].val.opval)); @@ -2114,7 +2117,7 @@ case 2: /* @1: %empty */ break; case 328: /* fieldvar: hsh */ -#line 1739 "perly.y" +#line 1742 "perly.y" { (yyval.pval) = PadnamelistARRAY(PL_comppad_name)[(ps[0].val.opval)->op_targ]; op_free((ps[0].val.opval)); @@ -2123,7 +2126,7 @@ case 2: /* @1: %empty */ break; case 329: /* fieldvar: ary */ -#line 1744 "perly.y" +#line 1747 "perly.y" { (yyval.pval) = PadnamelistARRAY(PL_comppad_name)[(ps[0].val.opval)->op_targ]; op_free((ps[0].val.opval)); @@ -2132,19 +2135,19 @@ case 2: /* @1: %empty */ break; case 330: /* optfieldattrlist: COLONATTR THING */ -#line 1752 "perly.y" +#line 1755 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 331: /* optfieldattrlist: COLONATTR */ -#line 1754 "perly.y" +#line 1757 "perly.y" { (yyval.opval) = NULL; } break; case 333: /* fielddecl: KW_FIELD fieldvar optfieldattrlist */ -#line 1760 "perly.y" +#line 1763 "perly.y" { parser->in_my = 0; if((ps[0].val.opval)) @@ -2155,7 +2158,7 @@ case 2: /* @1: %empty */ break; case 334: /* $@24: %empty */ -#line 1767 "perly.y" +#line 1770 "perly.y" { parser->in_my = 0; if((ps[-1].val.opval)) @@ -2167,7 +2170,7 @@ case 2: /* @1: %empty */ break; case 335: /* fielddecl: KW_FIELD fieldvar optfieldattrlist ASSIGNOP $@24 term */ -#line 1775 "perly.y" +#line 1778 "perly.y" { class_set_field_defop((PADNAME *)(ps[-4].val.pval), (ps[-2].val.ival), (ps[0].val.opval)); LEAVE; @@ -2177,25 +2180,25 @@ case 2: /* @1: %empty */ break; case 341: /* optrepl: PERLY_SLASH expr */ -#line 1795 "perly.y" +#line 1798 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; case 342: /* my_scalar: scalar */ -#line 1801 "perly.y" +#line 1804 "perly.y" { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); } break; case 343: /* list_of_scalars: list_of_scalars PERLY_COMMA */ -#line 1806 "perly.y" +#line 1809 "perly.y" { (yyval.opval) = (ps[-1].val.opval); } break; case 344: /* list_of_scalars: list_of_scalars PERLY_COMMA scalar */ -#line 1808 "perly.y" +#line 1811 "perly.y" { (yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), (ps[0].val.opval)); } @@ -2203,25 +2206,25 @@ case 2: /* @1: %empty */ break; case 346: /* my_list_of_scalars: list_of_scalars */ -#line 1815 "perly.y" +#line 1818 "perly.y" { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); } break; case 354: /* amper: PERLY_AMPERSAND indirob */ -#line 1832 "perly.y" +#line 1835 "perly.y" { (yyval.opval) = newCVREF((ps[-1].val.ival),(ps[0].val.opval)); } break; case 355: /* scalar: PERLY_DOLLAR indirob */ -#line 1836 "perly.y" +#line 1839 "perly.y" { (yyval.opval) = newSVREF((ps[0].val.opval)); } break; case 356: /* ary: PERLY_SNAIL indirob */ -#line 1840 "perly.y" +#line 1843 "perly.y" { (yyval.opval) = newAVREF((ps[0].val.opval)); if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival); } @@ -2229,7 +2232,7 @@ case 2: /* @1: %empty */ break; case 357: /* hsh: PERLY_PERCENT_SIGN indirob */ -#line 1846 "perly.y" +#line 1849 "perly.y" { (yyval.opval) = newHVREF((ps[0].val.opval)); if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival); } @@ -2237,61 +2240,61 @@ case 2: /* @1: %empty */ break; case 358: /* arylen: DOLSHARP indirob */ -#line 1852 "perly.y" +#line 1855 "perly.y" { (yyval.opval) = newAVREF((ps[0].val.opval)); } break; case 359: /* arylen: term ARROW DOLSHARP PERLY_STAR */ -#line 1854 "perly.y" +#line 1857 "perly.y" { (yyval.opval) = newAVREF((ps[-3].val.opval)); } break; case 360: /* star: PERLY_STAR indirob */ -#line 1858 "perly.y" +#line 1861 "perly.y" { (yyval.opval) = newGVREF(0,(ps[0].val.opval)); } break; case 362: /* sliceme: term ARROW PERLY_SNAIL */ -#line 1863 "perly.y" +#line 1866 "perly.y" { (yyval.opval) = newAVREF((ps[-2].val.opval)); } break; case 364: /* kvslice: term ARROW PERLY_PERCENT_SIGN */ -#line 1868 "perly.y" +#line 1871 "perly.y" { (yyval.opval) = newHVREF((ps[-2].val.opval)); } break; case 366: /* gelem: term ARROW PERLY_STAR */ -#line 1873 "perly.y" +#line 1876 "perly.y" { (yyval.opval) = newGVREF(0,(ps[-2].val.opval)); } break; case 367: /* indirob: BAREWORD */ -#line 1878 "perly.y" +#line 1881 "perly.y" { (yyval.opval) = scalar((ps[0].val.opval)); } break; case 368: /* indirob: scalar */ -#line 1880 "perly.y" +#line 1883 "perly.y" { (yyval.opval) = scalar((ps[0].val.opval)); } break; case 369: /* indirob: block */ -#line 1882 "perly.y" +#line 1885 "perly.y" { (yyval.opval) = op_scope((ps[0].val.opval)); } break; case 370: /* indirob: PRIVATEREF */ -#line 1885 "perly.y" +#line 1888 "perly.y" { (yyval.opval) = (ps[0].val.opval); } break; @@ -2303,6 +2306,6 @@ case 2: /* @1: %empty */ /* Generated from: - * 9ffef3efd5a65fca775d13b8308b64ffc50a847af75bc45eccc2d5c30389ab24 perly.y + * 057d77309acf1c5078a2eaa7aa2f5f46a754d0b158fe35bbd9c0cc1e4a6071a0 perly.y * f13e9c08cea6302f0c1d1f467405bd0e0880d0ea92d0669901017a7f7e94ab28 regen_perly.pl * ex: set ro ft=c: */ diff --git a/perly.h b/perly.h index 850b2b895a56..b8600a5bd0f2 100644 --- a/perly.h +++ b/perly.h @@ -246,6 +246,6 @@ int yyparse (void); /* Generated from: - * 9ffef3efd5a65fca775d13b8308b64ffc50a847af75bc45eccc2d5c30389ab24 perly.y + * 057d77309acf1c5078a2eaa7aa2f5f46a754d0b158fe35bbd9c0cc1e4a6071a0 perly.y * f13e9c08cea6302f0c1d1f467405bd0e0880d0ea92d0669901017a7f7e94ab28 regen_perly.pl * ex: set ro ft=c: */ diff --git a/perly.tab b/perly.tab index 943421a1214d..7229589067b1 100644 --- a/perly.tab +++ b/perly.tab @@ -361,41 +361,41 @@ static const yytype_int16 yyrline[] = 0, 187, 187, 186, 198, 197, 208, 207, 221, 220, 234, 233, 247, 246, 257, 256, 269, 278, 302, 296, 324, 332, 340, 347, 360, 365, 355, 386, 399, 418, - 434, 430, 459, 481, 495, 511, 524, 538, 546, 569, - 564, 588, 586, 623, 620, 653, 650, 679, 674, 696, - 710, 727, 725, 743, 755, 770, 779, 781, 786, 794, - 798, 805, 810, 817, 823, 827, 829, 826, 836, 837, - 847, 848, 857, 861, 865, 872, 889, 890, 891, 892, - 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, - 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, - 913, 917, 935, 936, 940, 944, 946, 948, 950, 952, - 954, 956, 959, 965, 966, 971, 982, 983, 988, 990, - 995, 1002, 1003, 1007, 1011, 1015, 1020, 1024, 1028, 1029, - 1032, 1038, 1043, 1048, 1054, 1055, 1060, 1061, 1066, 1067, - 1074, 1079, 1081, 1092, 1094, 1099, 1101, 1105, 1110, 1114, - 1122, 1127, 1135, 1137, 1142, 1144, 1152, 1153, 1154, 1159, - 1160, 1165, 1166, 1170, 1174, 1174, 1207, 1208, 1213, 1225, - 1226, 1231, 1230, 1243, 1245, 1247, 1249, 1251, 1255, 1257, - 1262, 1266, 1270, 1274, 1278, 1284, 1289, 1295, 1301, 1307, - 1313, 1315, 1317, 1320, 1319, 1333, 1334, 1338, 1342, 1345, - 1350, 1355, 1358, 1362, 1366, 1372, 1380, 1387, 1393, 1395, - 1397, 1402, 1404, 1406, 1408, 1410, 1412, 1417, 1419, 1421, - 1423, 1425, 1427, 1429, 1431, 1433, 1435, 1437, 1439, 1441, - 1443, 1445, 1447, 1451, 1453, 1455, 1457, 1459, 1463, 1465, - 1469, 1471, 1473, 1475, 1479, 1481, 1486, 1488, 1491, 1493, - 1495, 1498, 1501, 1512, 1515, 1523, 1525, 1527, 1530, 1532, - 1535, 1537, 1542, 1547, 1549, 1553, 1554, 1555, 1556, 1557, - 1559, 1561, 1563, 1565, 1567, 1569, 1571, 1573, 1575, 1577, - 1579, 1581, 1583, 1593, 1603, 1613, 1623, 1625, 1627, 1630, - 1635, 1639, 1641, 1643, 1645, 1648, 1650, 1653, 1655, 1657, - 1659, 1661, 1663, 1665, 1667, 1669, 1672, 1674, 1676, 1678, - 1680, 1682, 1686, 1689, 1688, 1701, 1702, 1703, 1708, 1710, - 1712, 1714, 1719, 1721, 1724, 1726, 1728, 1733, 1738, 1743, - 1751, 1753, 1755, 1759, 1767, 1766, 1784, 1785, 1789, 1790, - 1794, 1795, 1800, 1805, 1807, 1811, 1814, 1818, 1819, 1820, - 1823, 1824, 1827, 1828, 1831, 1835, 1839, 1845, 1851, 1853, - 1857, 1861, 1862, 1866, 1867, 1871, 1872, 1877, 1879, 1881, - 1884 + 434, 430, 459, 481, 495, 511, 524, 539, 547, 570, + 565, 589, 587, 624, 621, 654, 651, 680, 675, 697, + 712, 729, 727, 745, 757, 772, 781, 783, 788, 796, + 800, 807, 812, 819, 825, 829, 831, 828, 838, 839, + 849, 850, 859, 863, 867, 874, 891, 892, 893, 894, + 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, + 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, + 915, 919, 937, 938, 942, 946, 948, 950, 952, 954, + 956, 958, 961, 967, 968, 973, 985, 986, 991, 993, + 998, 1005, 1006, 1010, 1014, 1018, 1023, 1027, 1031, 1032, + 1035, 1041, 1046, 1051, 1057, 1058, 1063, 1064, 1069, 1070, + 1077, 1082, 1084, 1095, 1097, 1102, 1104, 1108, 1113, 1117, + 1125, 1130, 1138, 1140, 1145, 1147, 1155, 1156, 1157, 1162, + 1163, 1168, 1169, 1173, 1177, 1177, 1210, 1211, 1216, 1228, + 1229, 1234, 1233, 1246, 1248, 1250, 1252, 1254, 1258, 1260, + 1265, 1269, 1273, 1277, 1281, 1287, 1292, 1298, 1304, 1310, + 1316, 1318, 1320, 1323, 1322, 1336, 1337, 1341, 1345, 1348, + 1353, 1358, 1361, 1365, 1369, 1375, 1383, 1390, 1396, 1398, + 1400, 1405, 1407, 1409, 1411, 1413, 1415, 1420, 1422, 1424, + 1426, 1428, 1430, 1432, 1434, 1436, 1438, 1440, 1442, 1444, + 1446, 1448, 1450, 1454, 1456, 1458, 1460, 1462, 1466, 1468, + 1472, 1474, 1476, 1478, 1482, 1484, 1489, 1491, 1494, 1496, + 1498, 1501, 1504, 1515, 1518, 1526, 1528, 1530, 1533, 1535, + 1538, 1540, 1545, 1550, 1552, 1556, 1557, 1558, 1559, 1560, + 1562, 1564, 1566, 1568, 1570, 1572, 1574, 1576, 1578, 1580, + 1582, 1584, 1586, 1596, 1606, 1616, 1626, 1628, 1630, 1633, + 1638, 1642, 1644, 1646, 1648, 1651, 1653, 1656, 1658, 1660, + 1662, 1664, 1666, 1668, 1670, 1672, 1675, 1677, 1679, 1681, + 1683, 1685, 1689, 1692, 1691, 1704, 1705, 1706, 1711, 1713, + 1715, 1717, 1722, 1724, 1727, 1729, 1731, 1736, 1741, 1746, + 1754, 1756, 1758, 1762, 1770, 1769, 1787, 1788, 1792, 1793, + 1797, 1798, 1803, 1808, 1810, 1814, 1817, 1821, 1822, 1823, + 1826, 1827, 1830, 1831, 1834, 1838, 1842, 1848, 1854, 1856, + 1860, 1864, 1865, 1869, 1870, 1874, 1875, 1880, 1882, 1884, + 1887 }; #endif @@ -1673,6 +1673,6 @@ static const toketypes yy_type_tab[] = }; /* Generated from: - * 9ffef3efd5a65fca775d13b8308b64ffc50a847af75bc45eccc2d5c30389ab24 perly.y + * 057d77309acf1c5078a2eaa7aa2f5f46a754d0b158fe35bbd9c0cc1e4a6071a0 perly.y * f13e9c08cea6302f0c1d1f467405bd0e0880d0ea92d0669901017a7f7e94ab28 regen_perly.pl * ex: set ro ft=c: */ diff --git a/perly.y b/perly.y index 53d4279b98b4..784a22c42840 100644 --- a/perly.y +++ b/perly.y @@ -529,6 +529,7 @@ bare_statement_if mblock else { + ($mblock)->op_flags |= OPf_PARENS; $$ = block_end($remember, newCONDOP(0, $mexpr, op_scope($mblock), $else)); parser->copline = (line_t)$KW_IF; } @@ -701,6 +702,7 @@ bare_statement_unless mblock else { + ($mblock)->op_flags |= OPf_PARENS; $$ = block_end($remember, newCONDOP(0, $mexpr, $else, op_scope($mblock))); parser->copline = (line_t)$KW_UNLESS; } @@ -970,6 +972,7 @@ else } | KW_ELSIF PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock else[else.recurse] { parser->copline = (line_t)$KW_ELSIF; + ($mblock)->op_flags |= OPf_PARENS; $$ = newCONDOP(0, newSTATEOP(OPf_SPECIAL,NULL,$mexpr), op_scope($mblock), $[else.recurse]); From 6418a729533e6ef904b4c818ecdedb8a45824124 Mon Sep 17 00:00:00 2001 From: Richard Leach Date: Wed, 15 Oct 2025 00:06:15 +0000 Subject: [PATCH 2/3] Test fixes (to squash) --- ext/B/t/concise.t | 39 ++++++- ext/B/t/optree_samples.t | 242 +++++++++++++++++++++------------------ 2 files changed, 165 insertions(+), 116 deletions(-) diff --git a/ext/B/t/concise.t b/ext/B/t/concise.t index 58d010340491..f4ce2f42afc4 100644 --- a/ext/B/t/concise.t +++ b/ext/B/t/concise.t @@ -10,7 +10,7 @@ BEGIN { require 'test.pl'; # we use runperl from 'test.pl', so can't use Test::More } -plan tests => 167; +plan tests => 169; require_ok("B::Concise"); @@ -479,7 +479,40 @@ like $out, qr/$end/, 'OP_AND has op_other'; $out =~ $end; my $next = $1; -# Check it points to a PUSHMARK +# Check it points to an ENTER... +$end = <<'EOF'; +OP \(\) + op_next 0x\w+ + op_sibling 0x\w+ + op_ppaddr PL_ppaddr\[OP_ENTER\] +EOF + +$end =~ s//$next/; + +like $out, qr/$end/, 'OP_AND->op_other points correctly (1/3)'; + +$end =~ s/\top_next\t\t0x\\w\+/\top_next\t\t\(0x\\w\+\)/; + +$out =~ $end; +my $next = $1; + +# Then a NEXTSTATE... +$end = <<'EOF'; +COP \(\) + op_next 0x\w+ + op_sibling 0x\w+ + op_ppaddr PL_ppaddr\[OP_NEXTSTATE\] +EOF + +$end =~ s//$next/; + +like $out, qr/$end/, 'OP_AND->op_other points correctly (2/3)'; + +$end =~ s/\top_next\t\t0x\\w\+/\top_next\t\t\(0x\\w\+\)/; +$out =~ $end; +my $next = $1; + +# Then finally a PUSHMARK... $end = <<'EOF'; OP \(\) op_next 0x\w+ @@ -489,7 +522,7 @@ EOF $end =~ s//$next/; -like $out, qr/$end/, 'OP_AND->op_other points correctly'; +like $out, qr/$end/, 'OP_AND->op_other points correctly (3/3)'; # test nextstate hints display diff --git a/ext/B/t/optree_samples.t b/ext/B/t/optree_samples.t index 88e1ddf80cdd..42d05f42128f 100644 --- a/ext/B/t/optree_samples.t +++ b/ext/B/t/optree_samples.t @@ -22,41 +22,43 @@ checkOptree ( name => '-basic sub {if shift print then,else}', }, strip_open_hints => 1, expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); -# 7 <1> leavesub[1 ref] K/REFC,1 ->(end) -# - <@> lineseq KP ->7 -# 1 <;> nextstate(main 665 optree_samples.t:24) v:>,<,% ->2 +# a <1> leavesub[1 ref] K/REFC,1 ->(end) +# - <@> lineseq KP ->a +# 1 <;> nextstate(main 1587 optree_samples.t:20) v ->2 # - <1> null K/1 ->- -# 3 <|> cond_expr(other->4) K/1 ->8 +# 3 <|> cond_expr(other->4) K/1 ->b # 2 <0> shift s* ->3 -# - <@> scope K ->- -# - <;> ex-nextstate(main 1594 optree_samples.t:25) v:>,<,% ->4 -# 6 <@> print sK ->7 -# 4 <0> pushmark s ->5 -# 5 <$> const[PV "then"] s ->6 -# d <@> leave KP ->7 -# 8 <0> enter ->9 -# 9 <;> nextstate(main 663 optree_samples.t:25) v:>,<,% ->a -# c <@> print sK ->d -# a <0> pushmark s ->b -# b <$> const[PV "else"] s ->c +# 9 <@> leave KP ->a +# 4 <0> enter ->5 +# 5 <;> nextstate(main 1589 optree_samples.t:20) v ->6 +# 8 <@> print sK ->9 +# 6 <0> pushmark s ->7 +# 7 <$> const(PV "then") s ->8 +# g <@> leave KP ->a +# b <0> enter ->c +# c <;> nextstate(main 1591 optree_samples.t:21) v ->d +# f <@> print sK ->g +# d <0> pushmark s ->e +# e <$> const(PV "else") s ->f EOT_EOT -# 7 <1> leavesub[1 ref] K/REFC,1 ->(end) -# - <@> lineseq KP ->7 -# 1 <;> nextstate(main 665 optree_samples.t:24) v:>,<,% ->2 +# a <1> leavesub[1 ref] K/REFC,1 ->(end) +# - <@> lineseq KP ->a +# 1 <;> nextstate(main 1587 optree_samples.t:20) v ->2 # - <1> null K/1 ->- -# 3 <|> cond_expr(other->4) K/1 ->8 +# 3 <|> cond_expr(other->4) K/1 ->b # 2 <0> shift s* ->3 -# - <@> scope K ->- -# - <;> ex-nextstate(main 1594 optree_samples.t:25) v:>,<,% ->4 -# 6 <@> print sK ->7 -# 4 <0> pushmark s ->5 -# 5 <$> const(PV "then") s ->6 -# d <@> leave KP ->7 -# 8 <0> enter ->9 -# 9 <;> nextstate(main 663 optree_samples.t:25) v:>,<,% ->a -# c <@> print sK ->d -# a <0> pushmark s ->b -# b <$> const(PV "else") s ->c +# 9 <@> leave KP ->a +# 4 <0> enter ->5 +# 5 <;> nextstate(main 1589 optree_samples.t:20) v ->6 +# 8 <@> print sK ->9 +# 6 <0> pushmark s ->7 +# 7 <$> const(PV "then") s ->8 +# g <@> leave KP ->a +# b <0> enter ->c +# c <;> nextstate(main 1591 optree_samples.t:21) v ->d +# f <@> print sK ->g +# d <0> pushmark s ->e +# e <$> const(PV "else") s ->f EONT_EONT checkOptree ( name => '-basic (see above, with my $a = shift)', @@ -67,49 +69,51 @@ checkOptree ( name => '-basic (see above, with my $a = shift)', }, strip_open_hints => 1, expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); -# a <1> leavesub[1 ref] K/REFC,1 ->(end) -# - <@> lineseq KP ->a -# 1 <;> nextstate(main 666 optree_samples.t:70) v:>,<,% ->2 -# 3 <1> padsv_store[$a:666,670] vKS/LVINTRO ->4 +# d <1> leavesub[1 ref] K/REFC,1 ->(end) +# - <@> lineseq KP ->d +# 1 <;> nextstate(main 1595 optree_samples.t:64) v ->2 +# 3 <1> padsv_store[$a:1595,1602] vKS/LVINTRO ->4 # 2 <0> shift s* ->3 # - <0> ex-padsv sRM*/LVINTRO ->3 -# 4 <;> nextstate(main 670 optree_samples.t:71) v:>,<,% ->5 +# 4 <;> nextstate(main 1596 optree_samples.t:65) v ->5 # - <1> null K/1 ->- -# 6 <|> cond_expr(other->7) K/1 ->b -# 5 <0> padsv[$a:666,670] s ->6 -# - <@> scope K ->- -# - <;> ex-nextstate(main 1510 optree_samples.t:66) v:>,<,% ->7 -# 9 <@> print sK ->a -# 7 <0> pushmark s ->8 -# 8 <$> const[PV "foo"] s ->9 -# g <@> leave KP ->a -# b <0> enter ->c -# c <;> nextstate(main 1510 optree_samples.t:66) v:>,<,% ->d -# f <@> print sK ->g -# d <0> pushmark s ->e -# e <$> const[PV "bar"] s ->f +# 6 <|> cond_expr(other->7) K/1 ->e +# 5 <0> padsv[$a:1595,1602] s ->6 +# c <@> leave KP ->d +# 7 <0> enter ->8 +# 8 <;> nextstate(main 1598 optree_samples.t:65) v ->9 +# b <@> print sK ->c +# 9 <0> pushmark s ->a +# a <$> const(PV "foo") s ->b +# j <@> leave KP ->d +# e <0> enter ->f +# f <;> nextstate(main 1600 optree_samples.t:66) v ->g +# i <@> print sK ->j +# g <0> pushmark s ->h +# h <$> const(PV "bar") s ->i EOT_EOT -# a <1> leavesub[1 ref] K/REFC,1 ->(end) -# - <@> lineseq KP ->a -# 1 <;> nextstate(main 666 optree_samples.t:70) v:>,<,% ->2 -# 3 <1> padsv_store[$a:666,670] vKS/LVINTRO ->4 +# d <1> leavesub[1 ref] K/REFC,1 ->(end) +# - <@> lineseq KP ->d +# 1 <;> nextstate(main 1595 optree_samples.t:64) v ->2 +# 3 <1> padsv_store[$a:1595,1602] vKS/LVINTRO ->4 # 2 <0> shift s* ->3 # - <0> ex-padsv sRM*/LVINTRO ->3 -# 4 <;> nextstate(main 670 optree_samples.t:71) v:>,<,% ->5 +# 4 <;> nextstate(main 1596 optree_samples.t:65) v ->5 # - <1> null K/1 ->- -# 6 <|> cond_expr(other->7) K/1 ->b -# 5 <0> padsv[$a:666,670] s ->6 -# - <@> scope K ->- -# - <;> ex-nextstate(main 1510 optree_samples.t:70) v:>,<,% ->7 -# 9 <@> print sK ->a -# 7 <0> pushmark s ->8 -# 8 <$> const(PV "foo") s ->9 -# g <@> leave KP ->a -# b <0> enter ->c -# c <;> nextstate(main 668 optree_samples.t:72) v:>,<,% ->d -# f <@> print sK ->g -# d <0> pushmark s ->e -# e <$> const(PV "bar") s ->f +# 6 <|> cond_expr(other->7) K/1 ->e +# 5 <0> padsv[$a:1595,1602] s ->6 +# c <@> leave KP ->d +# 7 <0> enter ->8 +# 8 <;> nextstate(main 1598 optree_samples.t:65) v ->9 +# b <@> print sK ->c +# 9 <0> pushmark s ->a +# a <$> const(PV "foo") s ->b +# j <@> leave KP ->d +# e <0> enter ->f +# f <;> nextstate(main 1600 optree_samples.t:66) v ->g +# i <@> print sK ->j +# g <0> pushmark s ->h +# h <$> const(PV "bar") s ->i EONT_EONT checkOptree ( name => '-exec sub {if shift print then,else}', @@ -122,32 +126,38 @@ checkOptree ( name => '-exec sub {if shift print then,else}', # 1 <;> nextstate(main 674 optree_samples.t:125) v:>,<,% # 2 <0> shift s* # 3 <|> cond_expr(other->4) K/1 -# 4 <0> pushmark s -# 5 <$> const[PV "then"] s -# 6 <@> print sK -# goto 7 -# 8 <0> enter -# 9 <;> nextstate(main 672 optree_samples.t:126) v:>,<,% -# a <0> pushmark s -# b <$> const[PV "else"] s -# c <@> print sK -# d <@> leave KP -# 7 <1> leavesub[1 ref] K/REFC,1 +# 4 <0> enter +# 5 <;> nextstate(main 1606 optree_samples.t:121) v +# 6 <0> pushmark s +# 7 <$> const(PV "then") s +# 8 <@> print sK +# 9 <@> leave KP +# goto a +# b <0> enter +# c <;> nextstate(main 1608 optree_samples.t:122) v +# d <0> pushmark s +# e <$> const(PV "else") s +# f <@> print sK +# g <@> leave KP +# a <1> leavesub[1 ref] K/REFC,1 EOT_EOT -# 1 <;> nextstate(main 674 optree_samples.t:129) v:>,<,% +# 1 <;> nextstate(main 674 optree_samples.t:125) v:>,<,% # 2 <0> shift s* # 3 <|> cond_expr(other->4) K/1 -# 4 <0> pushmark s -# 5 <$> const(PV "then") s -# 6 <@> print sK -# goto 7 -# 8 <0> enter -# 9 <;> nextstate(main 672 optree_samples.t:130) v:>,<,% -# a <0> pushmark s -# b <$> const(PV "else") s -# c <@> print sK -# d <@> leave KP -# 7 <1> leavesub[1 ref] K/REFC,1 +# 4 <0> enter +# 5 <;> nextstate(main 1606 optree_samples.t:121) v +# 6 <0> pushmark s +# 7 <$> const(PV "then") s +# 8 <@> print sK +# 9 <@> leave KP +# goto a +# b <0> enter +# c <;> nextstate(main 1608 optree_samples.t:122) v +# d <0> pushmark s +# e <$> const(PV "else") s +# f <@> print sK +# g <@> leave KP +# a <1> leavesub[1 ref] K/REFC,1 EONT_EONT checkOptree ( name => '-exec (see above, with my $a = shift)', @@ -164,35 +174,41 @@ checkOptree ( name => '-exec (see above, with my $a = shift)', # 4 <;> nextstate(main 679 optree_samples.t:166) v:>,<,% # 5 <0> padsv[$a:675,679] s # 6 <|> cond_expr(other->7) K/1 -# 7 <0> pushmark s -# 8 <$> const[PV "foo"] s -# 9 <@> print sK -# goto a -# b <0> enter -# c <;> nextstate(main 677 optree_samples.t:167) v:>,<,% -# d <0> pushmark s -# e <$> const[PV "bar"] s -# f <@> print sK -# g <@> leave KP -# a <1> leavesub[1 ref] K/REFC,1 +# 7 <0> enter +# 8 <;> nextstate(main 1615 optree_samples.t:160) v +# 9 <0> pushmark s +# a <$> const(PV "foo") s +# b <@> print sK +# c <@> leave KP +# goto d +# e <0> enter +# f <;> nextstate(main 1617 optree_samples.t:161) v +# g <0> pushmark s +# h <$> const(PV "bar") s +# i <@> print sK +# j <@> leave KP +# d <1> leavesub[1 ref] K/REFC,1 EOT_EOT -# 1 <;> nextstate(main 675 optree_samples.t:171) v:>,<,% +# 1 <;> nextstate(main 675 optree_samples.t:165) v:>,<,% # 2 <0> shift s* # 3 <1> padsv_store[$a:1522,1529] vKS/LVINTRO -# 4 <;> nextstate(main 679 optree_samples.t:172) v:>,<,% +# 4 <;> nextstate(main 679 optree_samples.t:166) v:>,<,% # 5 <0> padsv[$a:675,679] s # 6 <|> cond_expr(other->7) K/1 -# 7 <0> pushmark s -# 8 <$> const(PV "foo") s -# 9 <@> print sK -# goto a -# b <0> enter -# c <;> nextstate(main 677 optree_samples.t:173) v:>,<,% -# d <0> pushmark s -# e <$> const(PV "bar") s -# f <@> print sK -# g <@> leave KP -# a <1> leavesub[1 ref] K/REFC,1 +# 7 <0> enter +# 8 <;> nextstate(main 1615 optree_samples.t:160) v +# 9 <0> pushmark s +# a <$> const(PV "foo") s +# b <@> print sK +# c <@> leave KP +# goto d +# e <0> enter +# f <;> nextstate(main 1617 optree_samples.t:161) v +# g <0> pushmark s +# h <$> const(PV "bar") s +# i <@> print sK +# j <@> leave KP +# d <1> leavesub[1 ref] K/REFC,1 EONT_EONT checkOptree ( name => '-exec sub { print (shift) ? "foo" : "bar" }', From 064e1a05ab01208999ea881d1f421322277b1e4f Mon Sep 17 00:00:00 2001 From: Richard Leach Date: Wed, 15 Oct 2025 00:36:26 +0000 Subject: [PATCH 3/3] New tests (to squash) --- MANIFEST | 1 + ext/B/t/optree_samples.t | 16 +++++------ t/op/if.t | 62 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 t/op/if.t diff --git a/MANIFEST b/MANIFEST index 00cf82165c24..269903f06065 100644 --- a/MANIFEST +++ b/MANIFEST @@ -6367,6 +6367,7 @@ t/op/hashwarn.t See if warnings for bad hash assignments work t/op/heredoc.t See if heredoc edge and corner cases work t/op/hexfp.t See if hexadecimal float literals work t/op/hook/require.t See if require hooks work properly. +t/op/if.t See if "if" blocks get ENTER/LEAVE wrapping t/op/inc.t See if inc/dec of integers near 32 bit limit work t/op/inccode.t See if coderefs work in @INC t/op/inccode-tie.t See if tie to @INC works diff --git a/ext/B/t/optree_samples.t b/ext/B/t/optree_samples.t index 42d05f42128f..d7b3a7d3b9c1 100644 --- a/ext/B/t/optree_samples.t +++ b/ext/B/t/optree_samples.t @@ -33,13 +33,13 @@ checkOptree ( name => '-basic sub {if shift print then,else}', # 5 <;> nextstate(main 1589 optree_samples.t:20) v ->6 # 8 <@> print sK ->9 # 6 <0> pushmark s ->7 -# 7 <$> const(PV "then") s ->8 +# 7 <$> const[PV "then"] s ->8 # g <@> leave KP ->a # b <0> enter ->c # c <;> nextstate(main 1591 optree_samples.t:21) v ->d # f <@> print sK ->g # d <0> pushmark s ->e -# e <$> const(PV "else") s ->f +# e <$> const[PV "else"] s ->f EOT_EOT # a <1> leavesub[1 ref] K/REFC,1 ->(end) # - <@> lineseq KP ->a @@ -84,13 +84,13 @@ checkOptree ( name => '-basic (see above, with my $a = shift)', # 8 <;> nextstate(main 1598 optree_samples.t:65) v ->9 # b <@> print sK ->c # 9 <0> pushmark s ->a -# a <$> const(PV "foo") s ->b +# a <$> const[PV "foo"] s ->b # j <@> leave KP ->d # e <0> enter ->f # f <;> nextstate(main 1600 optree_samples.t:66) v ->g # i <@> print sK ->j # g <0> pushmark s ->h -# h <$> const(PV "bar") s ->i +# h <$> const[PV "bar"] s ->i EOT_EOT # d <1> leavesub[1 ref] K/REFC,1 ->(end) # - <@> lineseq KP ->d @@ -129,14 +129,14 @@ checkOptree ( name => '-exec sub {if shift print then,else}', # 4 <0> enter # 5 <;> nextstate(main 1606 optree_samples.t:121) v # 6 <0> pushmark s -# 7 <$> const(PV "then") s +# 7 <$> const[PV "then"] s # 8 <@> print sK # 9 <@> leave KP # goto a # b <0> enter # c <;> nextstate(main 1608 optree_samples.t:122) v # d <0> pushmark s -# e <$> const(PV "else") s +# e <$> const[PV "else"] s # f <@> print sK # g <@> leave KP # a <1> leavesub[1 ref] K/REFC,1 @@ -177,14 +177,14 @@ checkOptree ( name => '-exec (see above, with my $a = shift)', # 7 <0> enter # 8 <;> nextstate(main 1615 optree_samples.t:160) v # 9 <0> pushmark s -# a <$> const(PV "foo") s +# a <$> const[PV "foo"] s # b <@> print sK # c <@> leave KP # goto d # e <0> enter # f <;> nextstate(main 1617 optree_samples.t:161) v # g <0> pushmark s -# h <$> const(PV "bar") s +# h <$> const[PV "bar"] s # i <@> print sK # j <@> leave KP # d <1> leavesub[1 ref] K/REFC,1 diff --git a/t/op/if.t b/t/op/if.t new file mode 100644 index 000000000000..e2459bfef4ec --- /dev/null +++ b/t/op/if.t @@ -0,0 +1,62 @@ +#!./perl -w + +chdir 't' if -d 't'; +require './test.pl'; +set_up_inc('../lib'); + +use strict; + +$|=1; + +run_multiple_progs('', \*DATA); + +done_testing(); + +__DATA__ +# GH #22204 +package foo; +sub new { + return bless {}, 'foo'; +} + +sub DESTROY { + $main::status = "Finished"; +} + +package main; +for (0..1) { + $status = "Started"; + print $status, "\n"; + if ($_) { + my $magic = foo->new(); + } else { + my $magic = foo->new(); + } + print " $status\n"; +} +print "$status\n"; +EXPECT +Started + Finished +Started + Finished +Finished +######## +# GH #23175 +sub bogocarp() { my ($fi, $pa, $line) = caller; die("$line should have been 5"); } +my $gr = 1; +if ($gr) { + bogocarp(); +} +EXPECT +5 should have been 5 at - line 2. +######## +# GH #12573 +my $something; +if( ! $something ) +{ +die("Hi from line ".__LINE__); +} +EXPECT +Hi from line 5 at - line 5. +