perl/perly.act
Tony Cook 0d9e3bc6db perly LSTOPSUB: prevent a double op free between parse stack and CV
The reeproducer resulted in the "block" OP being both on the parser
stack and attacked to the CV.  If an error occurred while parsing the
rest of the list operator clean up would release the OP as attached
to the CV, and the same OP on the parse stack, resulting in a double
free.

It's unclear to me whether bison is intended to support modifying
the parse stack entry like this, but it appears to work here.

Fixes #21724
2024-05-02 16:28:18 +01:00

2364 lines
70 KiB
C
Generated

/* -*- mode: C; buffer-read-only: t -*-
!!!!!!! DO NOT EDIT THIS FILE !!!!!!!
This file is built by regen_perly.pl from perly.y.
Any changes made here will be lost!
*/
case 2: /* @1: %empty */
#line 161 "perly.y"
{
parser->expect = XSTATE;
(yyval.ival) = 0;
}
break;
case 3: /* grammar: GRAMPROG @1 remember stmtseq */
#line 166 "perly.y"
{
newPROG(block_end((ps[-1].val.ival),(ps[0].val.opval)));
PL_compiling.cop_seq = 0;
(yyval.ival) = 0;
}
break;
case 4: /* @2: %empty */
#line 172 "perly.y"
{
parser->expect = XTERM;
(yyval.ival) = 0;
}
break;
case 5: /* grammar: GRAMEXPR @2 optexpr */
#line 177 "perly.y"
{
PL_eval_root = (ps[0].val.opval);
(yyval.ival) = 0;
}
break;
case 6: /* @3: %empty */
#line 182 "perly.y"
{
parser->expect = XBLOCK;
(yyval.ival) = 0;
}
break;
case 7: /* grammar: GRAMBLOCK @3 block */
#line 187 "perly.y"
{
PL_pad_reset_pending = TRUE;
PL_eval_root = (ps[0].val.opval);
(yyval.ival) = 0;
yyunlex();
parser->yychar = yytoken = YYEOF;
}
break;
case 8: /* @4: %empty */
#line 195 "perly.y"
{
parser->expect = XSTATE;
(yyval.ival) = 0;
}
break;
case 9: /* grammar: GRAMBARESTMT @4 barestmt */
#line 200 "perly.y"
{
PL_pad_reset_pending = TRUE;
PL_eval_root = (ps[0].val.opval);
(yyval.ival) = 0;
yyunlex();
parser->yychar = yytoken = YYEOF;
}
break;
case 10: /* @5: %empty */
#line 208 "perly.y"
{
parser->expect = XSTATE;
(yyval.ival) = 0;
}
break;
case 11: /* grammar: GRAMFULLSTMT @5 fullstmt */
#line 213 "perly.y"
{
PL_pad_reset_pending = TRUE;
PL_eval_root = (ps[0].val.opval);
(yyval.ival) = 0;
yyunlex();
parser->yychar = yytoken = YYEOF;
}
break;
case 12: /* @6: %empty */
#line 221 "perly.y"
{
parser->expect = XSTATE;
(yyval.ival) = 0;
}
break;
case 13: /* grammar: GRAMSTMTSEQ @6 stmtseq */
#line 226 "perly.y"
{
PL_eval_root = (ps[0].val.opval);
(yyval.ival) = 0;
}
break;
case 14: /* @7: %empty */
#line 231 "perly.y"
{
parser->expect = XSTATE;
(yyval.ival) = 0;
}
break;
case 15: /* grammar: GRAMSUBSIGNATURE @7 subsigguts */
#line 236 "perly.y"
{
PL_eval_root = (ps[0].val.opval);
(yyval.ival) = 0;
}
break;
case 16: /* sigsub_or_method_named: KW_SUB_named_sig */
#line 245 "perly.y"
{ (yyval.ival) = KW_SUB_named_sig; }
break;
case 17: /* sigsub_or_method_named: KW_METHOD_named */
#line 247 "perly.y"
{ (yyval.ival) = KW_METHOD_named; }
break;
case 18: /* block: PERLY_BRACE_OPEN remember stmtseq PERLY_BRACE_CLOSE */
#line 252 "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));
}
break;
case 19: /* empty: %empty */
#line 259 "perly.y"
{ (yyval.opval) = NULL; }
break;
case 20: /* formblock: PERLY_EQUAL_SIGN remember PERLY_SEMICOLON FORMRBRACK formstmtseq PERLY_SEMICOLON PERLY_DOT */
#line 264 "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));
}
break;
case 21: /* remember: %empty */
#line 271 "perly.y"
{ (yyval.ival) = block_start(TRUE);
parser->parsed_sub = 0; }
break;
case 22: /* mblock: PERLY_BRACE_OPEN mremember stmtseq PERLY_BRACE_CLOSE */
#line 276 "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));
}
break;
case 23: /* mremember: %empty */
#line 283 "perly.y"
{ (yyval.ival) = block_start(FALSE);
parser->parsed_sub = 0; }
break;
case 25: /* $@8: %empty */
#line 292 "perly.y"
{ parser->in_my = 1; }
break;
case 26: /* $@9: %empty */
#line 294 "perly.y"
{ parser->in_my = 0; intro_my(); }
break;
case 27: /* catch_paren: PERLY_PAREN_OPEN $@8 scalar $@9 PERLY_PAREN_CLOSE */
#line 296 "perly.y"
{ (yyval.opval) = (ps[-2].val.opval); }
break;
case 29: /* stmtseq: stmtseq fullstmt */
#line 303 "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))
PL_hints |= HINT_BLOCK_SCOPE;
}
break;
case 31: /* formstmtseq: formstmtseq formline */
#line 314 "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))
PL_hints |= HINT_BLOCK_SCOPE;
}
break;
case 32: /* fullstmt: barestmt */
#line 323 "perly.y"
{
(yyval.opval) = (ps[0].val.opval) ? newSTATEOP(0, NULL, (ps[0].val.opval)) : NULL;
}
break;
case 33: /* fullstmt: labfullstmt */
#line 327 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 34: /* labfullstmt: LABEL barestmt */
#line 331 "perly.y"
{
SV *label = cSVOPx_sv((ps[-1].val.opval));
(yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8,
savepv(SvPVX_const(label)), (ps[0].val.opval));
op_free((ps[-1].val.opval));
}
break;
case 35: /* labfullstmt: LABEL labfullstmt */
#line 338 "perly.y"
{
SV *label = cSVOPx_sv((ps[-1].val.opval));
(yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8,
savepv(SvPVX_const(label)), (ps[0].val.opval));
op_free((ps[-1].val.opval));
}
break;
case 36: /* barestmt: PLUGSTMT */
#line 348 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 37: /* barestmt: KW_FORMAT startformsub formname formblock */
#line 350 "perly.y"
{
CV *fmtcv = PL_compcv;
newFORM((ps[-2].val.ival), (ps[-1].val.opval), (ps[0].val.opval));
(yyval.opval) = NULL;
if (CvOUTSIDE(fmtcv) && !CvEVAL(CvOUTSIDE(fmtcv))) {
pad_add_weakref(fmtcv);
}
parser->parsed_sub = 1;
}
break;
case 38: /* $@10: %empty */
#line 362 "perly.y"
{
init_named_cv(PL_compcv, (ps[-1].val.opval));
parser->in_my = 0;
parser->in_my_stash = NULL;
}
break;
case 39: /* barestmt: KW_SUB_named subname startsub $@10 proto subattrlist optsubbody */
#line 368 "perly.y"
{
SvREFCNT_inc_simple_void(PL_compcv);
(ps[-5].val.opval)->op_type == OP_CONST
? newATTRSUB((ps[-4].val.ival), (ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval))
: newMYSUB((ps[-4].val.ival), (ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval))
;
(yyval.opval) = NULL;
intro_my();
parser->parsed_sub = 1;
}
break;
case 40: /* $@11: %empty */
#line 383 "perly.y"
{
init_named_cv(PL_compcv, (ps[-1].val.opval));
if((ps[-2].val.ival) == KW_METHOD_named) {
croak_kw_unless_class("method");
class_prepare_method_parse(PL_compcv);
}
parser->in_my = 0;
parser->in_my_stash = NULL;
}
break;
case 41: /* barestmt: sigsub_or_method_named subname startsub $@11 subattrlist optsigsubbody */
#line 393 "perly.y"
{
OP *body = (ps[0].val.opval);
SvREFCNT_inc_simple_void(PL_compcv);
(ps[-4].val.opval)->op_type == OP_CONST
? newATTRSUB((ps[-3].val.ival), (ps[-4].val.opval), NULL, (ps[-1].val.opval), body)
: newMYSUB( (ps[-3].val.ival), (ps[-4].val.opval), NULL, (ps[-1].val.opval), body)
;
(yyval.opval) = NULL;
intro_my();
parser->parsed_sub = 1;
}
break;
case 42: /* $@12: %empty */
#line 406 "perly.y"
{
switch((ps[-1].val.ival)) {
case KEY_ADJUST:
croak_kw_unless_class("ADJUST");
class_prepare_method_parse(PL_compcv);
break;
default:
NOT_REACHED;
}
}
break;
case 43: /* barestmt: PHASER startsub $@12 optsubbody */
#line 417 "perly.y"
{
OP *body = (ps[0].val.opval);
SvREFCNT_inc_simple_void(PL_compcv);
CV *cv;
switch((ps[-3].val.ival)) {
case KEY_ADJUST:
cv = newATTRSUB((ps[-2].val.ival), NULL, NULL, NULL, body);
class_add_ADJUST(PL_curstash, cv);
break;
}
(yyval.opval) = NULL;
}
break;
case 44: /* barestmt: KW_PACKAGE BAREWORD BAREWORD PERLY_SEMICOLON */
#line 436 "perly.y"
{
package((ps[-1].val.opval));
if ((ps[-2].val.opval))
package_version((ps[-2].val.opval));
(yyval.opval) = NULL;
}
break;
case 45: /* barestmt: KW_CLASS BAREWORD BAREWORD subattrlist PERLY_SEMICOLON */
#line 443 "perly.y"
{
package((ps[-2].val.opval));
if ((ps[-3].val.opval))
package_version((ps[-3].val.opval));
(yyval.opval) = NULL;
class_setup_stash(PL_curstash);
if ((ps[-1].val.opval)) {
class_apply_attributes(PL_curstash, (ps[-1].val.opval));
}
}
break;
case 46: /* $@13: %empty */
#line 454 "perly.y"
{ CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
break;
case 47: /* barestmt: KW_USE_or_NO startsub $@13 BAREWORD BAREWORD optlistexpr PERLY_SEMICOLON */
#line 458 "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));
parser->parsed_sub = 1;
(yyval.opval) = NULL;
}
break;
case 48: /* barestmt: KW_IF PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else */
#line 465 "perly.y"
{
(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);
}
break;
case 49: /* barestmt: KW_UNLESS PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else */
#line 471 "perly.y"
{
(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);
}
break;
case 50: /* barestmt: KW_GIVEN PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock */
#line 477 "perly.y"
{
(yyval.opval) = block_end((ps[-3].val.ival), newGIVENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)), 0));
parser->copline = (line_t)(ps[-5].val.ival);
}
break;
case 51: /* barestmt: KW_WHEN PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock */
#line 482 "perly.y"
{ (yyval.opval) = block_end((ps[-3].val.ival), newWHENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)))); }
break;
case 52: /* barestmt: KW_DEFAULT block */
#line 484 "perly.y"
{ (yyval.opval) = newWHENOP(0, op_scope((ps[0].val.opval))); }
break;
case 53: /* barestmt: KW_WHILE PERLY_PAREN_OPEN remember texpr PERLY_PAREN_CLOSE mintro mblock cont */
#line 486 "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);
}
break;
case 54: /* barestmt: KW_UNTIL PERLY_PAREN_OPEN remember iexpr PERLY_PAREN_CLOSE mintro mblock cont */
#line 493 "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);
}
break;
case 55: /* $@14: %empty */
#line 500 "perly.y"
{ parser->expect = XTERM; }
break;
case 56: /* $@15: %empty */
#line 502 "perly.y"
{ parser->expect = XTERM; }
break;
case 57: /* barestmt: KW_FOR PERLY_PAREN_OPEN remember mnexpr PERLY_SEMICOLON $@14 texpr PERLY_SEMICOLON $@15 mintro mnexpr PERLY_PAREN_CLOSE mblock */
#line 505 "perly.y"
{
OP *initop = (ps[-9].val.opval);
OP *forop = newWHILEOP(0, 1, NULL,
scalar((ps[-6].val.opval)), (ps[0].val.opval), (ps[-2].val.opval), (ps[-3].val.ival));
if (initop) {
forop = op_prepend_elem(OP_LINESEQ, initop,
op_append_elem(OP_LINESEQ,
newOP(OP_UNSTACK, OPf_SPECIAL),
forop));
}
PL_hints |= HINT_BLOCK_SCOPE;
(yyval.opval) = block_end((ps[-10].val.ival), forop);
parser->copline = (line_t)(ps[-12].val.ival);
}
break;
case 58: /* barestmt: KW_FOR KW_MY remember my_scalar PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont */
#line 520 "perly.y"
{
(yyval.opval) = block_end((ps[-6].val.ival), newFOROP(0, (ps[-5].val.opval), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
parser->copline = (line_t)(ps[-8].val.ival);
}
break;
case 59: /* barestmt: KW_FOR KW_MY remember PERLY_PAREN_OPEN my_list_of_scalars PERLY_PAREN_CLOSE PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont */
#line 525 "perly.y"
{
if ((ps[-6].val.opval)->op_type == OP_PADSV)
/* degenerate case of 1 var: for my ($x) ....
Flag it so it can be special-cased in newFOROP */
(ps[-6].val.opval)->op_flags |= OPf_PARENS;
(yyval.opval) = block_end((ps[-8].val.ival), newFOROP(0, (ps[-6].val.opval), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
parser->copline = (line_t)(ps[-10].val.ival);
}
break;
case 60: /* barestmt: KW_FOR scalar PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont */
#line 534 "perly.y"
{
(yyval.opval) = block_end((ps[-4].val.ival), newFOROP(0,
op_lvalue((ps[-6].val.opval), OP_ENTERLOOP), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
parser->copline = (line_t)(ps[-7].val.ival);
}
break;
case 61: /* @16: %empty */
#line 540 "perly.y"
{ parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); }
break;
case 62: /* barestmt: KW_FOR my_refgen remember my_var @16 PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont */
#line 542 "perly.y"
{
(yyval.opval) = block_end(
(ps[-7].val.ival),
newFOROP(0,
op_lvalue(
newUNOP(OP_REFGEN, 0,
(ps[-5].val.opval)),
OP_ENTERLOOP),
(ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval))
);
parser->copline = (line_t)(ps[-9].val.ival);
}
break;
case 63: /* barestmt: KW_FOR REFGEN refgen_topic PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont */
#line 555 "perly.y"
{
(yyval.opval) = block_end((ps[-4].val.ival), newFOROP(
0, op_lvalue(newUNOP(OP_REFGEN, 0,
(ps[-6].val.opval)),
OP_ENTERLOOP), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
parser->copline = (line_t)(ps[-8].val.ival);
}
break;
case 64: /* barestmt: KW_FOR PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont */
#line 563 "perly.y"
{
(yyval.opval) = block_end((ps[-4].val.ival),
newFOROP(0, NULL, (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
parser->copline = (line_t)(ps[-6].val.ival);
}
break;
case 65: /* $@17: %empty */
#line 569 "perly.y"
{
if(!(ps[0].val.opval)) {
yyerror("catch block requires a (VAR)");
YYERROR;
}
}
break;
case 66: /* barestmt: KW_TRY mblock KW_CATCH remember catch_paren $@17 mblock finally */
#line 576 "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))
(yyval.opval) = op_wrap_finally((yyval.opval), (ps[0].val.opval));
parser->copline = (line_t)(ps[-7].val.ival);
}
break;
case 67: /* barestmt: block cont */
#line 584 "perly.y"
{
/* a block is a loop that happens once */
(yyval.opval) = newWHILEOP(0, 1, NULL,
NULL, (ps[-1].val.opval), (ps[0].val.opval), 0);
}
break;
case 68: /* $@18: %empty */
#line 590 "perly.y"
{
package((ps[-2].val.opval));
if ((ps[-3].val.opval)) {
package_version((ps[-3].val.opval));
}
}
break;
case 69: /* barestmt: KW_PACKAGE BAREWORD BAREWORD PERLY_BRACE_OPEN remember $@18 stmtseq PERLY_BRACE_CLOSE */
#line 597 "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);
if (parser->copline > (line_t)(ps[-4].val.ival))
parser->copline = (line_t)(ps[-4].val.ival);
}
break;
case 70: /* $@19: %empty */
#line 605 "perly.y"
{
package((ps[-3].val.opval));
if ((ps[-4].val.opval)) {
package_version((ps[-4].val.opval));
}
class_setup_stash(PL_curstash);
if ((ps[-2].val.opval)) {
class_apply_attributes(PL_curstash, (ps[-2].val.opval));
}
}
break;
case 71: /* barestmt: KW_CLASS BAREWORD BAREWORD subattrlist PERLY_BRACE_OPEN remember $@19 stmtseq PERLY_BRACE_CLOSE */
#line 617 "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);
if (parser->copline > (line_t)(ps[-4].val.ival))
parser->copline = (line_t)(ps[-4].val.ival);
}
break;
case 72: /* barestmt: fielddecl PERLY_SEMICOLON */
#line 625 "perly.y"
{
(yyval.opval) = (ps[-1].val.opval);
}
break;
case 73: /* barestmt: sideff PERLY_SEMICOLON */
#line 629 "perly.y"
{
(yyval.opval) = (ps[-1].val.opval);
}
break;
case 74: /* barestmt: KW_DEFER mblock */
#line 633 "perly.y"
{
(yyval.opval) = newDEFEROP(0, op_scope((ps[0].val.opval)));
}
break;
case 75: /* barestmt: YADAYADA PERLY_SEMICOLON */
#line 637 "perly.y"
{
/* diag_listed_as: Unimplemented */
(yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
}
break;
case 76: /* barestmt: PERLY_SEMICOLON */
#line 643 "perly.y"
{
(yyval.opval) = NULL;
parser->copline = NOLINE;
}
break;
case 77: /* formline: THING formarg */
#line 651 "perly.y"
{ OP *list;
if ((ps[0].val.opval)) {
OP *term = (ps[0].val.opval);
list = op_append_elem(OP_LIST, (ps[-1].val.opval), term);
}
else {
list = (ps[-1].val.opval);
}
if (parser->copline == NOLINE)
parser->copline = CopLINE(PL_curcop)-1;
else parser->copline--;
(yyval.opval) = newSTATEOP(0, NULL,
op_convert_list(OP_FORMLINE, 0, list));
}
break;
case 79: /* formarg: FORMLBRACK stmtseq FORMRBRACK */
#line 670 "perly.y"
{ (yyval.opval) = op_unscope((ps[-1].val.opval)); }
break;
case 81: /* sideff: error */
#line 678 "perly.y"
{ (yyval.opval) = NULL; }
break;
case 82: /* sideff: expr */
#line 680 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 83: /* sideff: expr KW_IF condition */
#line 682 "perly.y"
{ (yyval.opval) = newLOGOP(OP_AND, 0, (ps[0].val.opval), (ps[-2].val.opval)); }
break;
case 84: /* sideff: expr KW_UNLESS condition */
#line 684 "perly.y"
{ (yyval.opval) = newLOGOP(OP_OR, 0, (ps[0].val.opval), (ps[-2].val.opval)); }
break;
case 85: /* sideff: expr KW_WHILE condition */
#line 686 "perly.y"
{ (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[0].val.opval)), (ps[-2].val.opval)); }
break;
case 86: /* sideff: expr KW_UNTIL iexpr */
#line 688 "perly.y"
{ (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[0].val.opval), (ps[-2].val.opval)); }
break;
case 87: /* sideff: expr KW_FOR condition */
#line 690 "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 88: /* sideff: expr KW_WHEN condition */
#line 693 "perly.y"
{ (yyval.opval) = newWHENOP((ps[0].val.opval), op_scope((ps[-2].val.opval))); }
break;
case 90: /* else: KW_ELSE mblock */
#line 700 "perly.y"
{
((ps[0].val.opval))->op_flags |= OPf_PARENS;
(yyval.opval) = op_scope((ps[0].val.opval));
}
break;
case 91: /* else: KW_ELSIF PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock else */
#line 705 "perly.y"
{ parser->copline = (line_t)(ps[-5].val.ival);
(yyval.opval) = newCONDOP(0,
newSTATEOP(OPf_SPECIAL,NULL,(ps[-3].val.opval)),
op_scope((ps[-1].val.opval)), (ps[0].val.opval));
PL_hints |= HINT_BLOCK_SCOPE;
}
break;
case 93: /* cont: KW_CONTINUE block */
#line 717 "perly.y"
{ (yyval.opval) = op_scope((ps[0].val.opval)); }
break;
case 94: /* finally: %empty */
#line 722 "perly.y"
{ (yyval.opval) = NULL; }
break;
case 95: /* finally: KW_FINALLY block */
#line 724 "perly.y"
{ (yyval.opval) = op_scope((ps[0].val.opval)); }
break;
case 96: /* mintro: %empty */
#line 729 "perly.y"
{ (yyval.ival) = (PL_min_intro_pending &&
PL_max_intro_pending >= PL_min_intro_pending);
intro_my(); }
break;
case 99: /* texpr: %empty */
#line 741 "perly.y"
{ YYSTYPE tmplval;
(void)scan_num("1", &tmplval);
(yyval.opval) = tmplval.opval; }
break;
case 101: /* iexpr: expr */
#line 749 "perly.y"
{ (yyval.opval) = invert(scalar((ps[0].val.opval))); }
break;
case 102: /* mexpr: expr */
#line 754 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); intro_my(); }
break;
case 103: /* mnexpr: nexpr */
#line 758 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); intro_my(); }
break;
case 104: /* formname: BAREWORD */
#line 761 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 106: /* startsub: %empty */
#line 766 "perly.y"
{ (yyval.ival) = start_subparse(FALSE, 0);
SAVEFREESV(PL_compcv); }
break;
case 107: /* startanonsub: %empty */
#line 772 "perly.y"
{ (yyval.ival) = start_subparse(FALSE, CVf_ANON);
SAVEFREESV(PL_compcv); }
break;
case 108: /* startanonmethod: %empty */
#line 777 "perly.y"
{ (yyval.ival) = start_subparse(FALSE, CVf_ANON|CVf_IsMETHOD);
SAVEFREESV(PL_compcv); }
break;
case 109: /* startformsub: %empty */
#line 782 "perly.y"
{ (yyval.ival) = start_subparse(TRUE, 0);
SAVEFREESV(PL_compcv); }
break;
case 115: /* subattrlist: COLONATTR THING */
#line 801 "perly.y"
{
OP *attrlist = (ps[0].val.opval);
if(attrlist && !PL_parser->sig_seen)
attrlist = apply_builtin_cv_attributes(PL_compcv, attrlist);
(yyval.opval) = attrlist;
}
break;
case 116: /* subattrlist: COLONATTR */
#line 808 "perly.y"
{ (yyval.opval) = NULL; }
break;
case 117: /* myattrlist: COLONATTR THING */
#line 813 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 118: /* myattrlist: COLONATTR */
#line 815 "perly.y"
{ (yyval.opval) = NULL; }
break;
case 119: /* sigvarname: %empty */
#line 826 "perly.y"
{ parser->in_my = 0; (yyval.opval) = NULL; }
break;
case 120: /* sigvarname: PRIVATEREF */
#line 828 "perly.y"
{ parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); }
break;
case 121: /* sigslurpsigil: PERLY_SNAIL */
#line 833 "perly.y"
{ (yyval.ival) = '@'; }
break;
case 122: /* sigslurpsigil: PERLY_PERCENT_SIGN */
#line 835 "perly.y"
{ (yyval.ival) = '%'; }
break;
case 123: /* sigslurpelem: sigslurpsigil sigvarname sigdefault */
#line 839 "perly.y"
{
I32 sigil = (ps[-2].val.ival);
OP *var = (ps[-1].val.opval);
OP *defop = (ps[0].val.opval);
if (parser->sig_slurpy)
yyerror("Multiple slurpy parameters not allowed");
parser->sig_slurpy = (char)sigil;
if (defop)
yyerror("A slurpy parameter may not have "
"a default value");
(yyval.opval) = var ? newSTATEOP(0, NULL, var) : NULL;
}
break;
case 125: /* sigdefault: ASSIGNOP */
#line 860 "perly.y"
{ (yyval.opval) = newARGDEFELEMOP(0, newOP(OP_NULL, 0), parser->sig_elems); }
break;
case 126: /* sigdefault: ASSIGNOP term */
#line 862 "perly.y"
{
I32 flags = 0;
if ((ps[-1].val.ival) == OP_DORASSIGN)
flags |= OPpARG_IF_UNDEF << 8;
if ((ps[-1].val.ival) == OP_ORASSIGN)
flags |= OPpARG_IF_FALSE << 8;
(yyval.opval) = newARGDEFELEMOP(flags, (ps[0].val.opval), parser->sig_elems);
}
break;
case 127: /* sigscalarelem: PERLY_DOLLAR sigvarname sigdefault */
#line 875 "perly.y"
{
OP *var = (ps[-1].val.opval);
OP *defop = (ps[0].val.opval);
if (parser->sig_slurpy)
yyerror("Slurpy parameter not last");
parser->sig_elems++;
if (defop) {
parser->sig_optelems++;
OP *defexpr = cLOGOPx(defop)->op_first;
if ( defexpr->op_type == OP_NULL
&& !(defexpr->op_flags & OPf_KIDS))
{
/* handle '$=' special case */
if (var)
yyerror("Optional parameter "
"lacks default expression");
op_free(defop);
}
else {
/* a normal '=default' expression */
if (var) {
var->op_flags |= OPf_STACKED;
(void)op_sibling_splice(var,
NULL, 0, defop);
scalar(defop);
}
else
var = newUNOP(OP_NULL, 0, defop);
LINKLIST(var);
/* NB: normally the first child of a
* logop is executed before the logop,
* and it pushes a boolean result
* ready for the logop. For ARGDEFELEM,
* the op itself does the boolean
* calculation, so set the first op to
* it instead.
*/
var->op_next = defop;
defexpr->op_next = var;
}
}
else {
if (parser->sig_optelems)
yyerror("Mandatory parameter "
"follows optional parameter");
}
(yyval.opval) = var ? newSTATEOP(0, NULL, var) : NULL;
}
break;
case 128: /* sigelem: sigscalarelem */
#line 935 "perly.y"
{ parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); }
break;
case 129: /* sigelem: sigslurpelem */
#line 937 "perly.y"
{ parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); }
break;
case 130: /* siglist: siglist PERLY_COMMA */
#line 943 "perly.y"
{ (yyval.opval) = (ps[-1].val.opval); }
break;
case 131: /* siglist: siglist PERLY_COMMA sigelem */
#line 945 "perly.y"
{
(yyval.opval) = op_append_list(OP_LINESEQ, (ps[-2].val.opval), (ps[0].val.opval));
}
break;
case 132: /* siglist: sigelem */
#line 949 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 137: /* subsignature: PERLY_PAREN_OPEN subsigguts PERLY_PAREN_CLOSE */
#line 966 "perly.y"
{ (yyval.opval) = (ps[-1].val.opval); }
break;
case 138: /* $@20: %empty */
#line 969 "perly.y"
{
ENTER;
SAVEIV(parser->sig_elems);
SAVEIV(parser->sig_optelems);
SAVEI8(parser->sig_slurpy);
parser->sig_elems = 0;
parser->sig_optelems = 0;
parser->sig_slurpy = 0;
parser->in_my = KEY_sigvar;
}
break;
case 139: /* subsigguts: $@20 optsiglist */
#line 980 "perly.y"
{
OP *sigops = (ps[0].val.opval);
struct op_argcheck_aux *aux;
OP *check;
if (!FEATURE_SIGNATURES_IS_ENABLED && !CvIsMETHOD(PL_compcv))
Perl_croak(aTHX_ "Experimental "
"subroutine signatures not enabled");
/* We shouldn't get here otherwise */
aux = (struct op_argcheck_aux*)
PerlMemShared_malloc(
sizeof(struct op_argcheck_aux));
aux->params = parser->sig_elems;
aux->opt_params = parser->sig_optelems;
aux->slurpy = parser->sig_slurpy;
check = newUNOP_AUX(OP_ARGCHECK, 0, NULL,
(UNOP_AUX_item *)aux);
sigops = op_prepend_elem(OP_LINESEQ, check, sigops);
sigops = op_prepend_elem(OP_LINESEQ,
newSTATEOP(0, NULL, NULL),
sigops);
/* a nextstate at the end handles context
* correctly for an empty sub body */
sigops = op_append_elem(OP_LINESEQ,
sigops,
newSTATEOP(0, NULL, NULL));
/* wrap the list of arg ops in a NULL aux op.
This serves two purposes. First, it makes
the arg list a separate subtree from the
body of the sub, and secondly the null op
may in future be upgraded to an OP_SIGNATURE
when implemented. For now leave it as
ex-argcheck */
(yyval.opval) = newUNOP_AUX(OP_ARGCHECK, 0, sigops, NULL);
op_null((yyval.opval));
CvSIGNATURE_on(PL_compcv);
parser->in_my = 0;
/* tell the toker that attrributes can follow
* this sig, but only so that the toker
* can skip through any (illegal) trailing
* attribute text then give a useful error
* message about "attributes before sig",
* rather than falling over ina mess at
* unrecognised syntax.
*/
parser->expect = XATTRBLOCK;
parser->sig_seen = TRUE;
LEAVE;
}
break;
case 141: /* optsubbody: PERLY_SEMICOLON */
#line 1037 "perly.y"
{ (yyval.opval) = NULL; }
break;
case 142: /* subbody: remember PERLY_BRACE_OPEN stmtseq PERLY_BRACE_CLOSE */
#line 1043 "perly.y"
{
if (parser->copline > (line_t)(ps[-2].val.ival))
parser->copline = (line_t)(ps[-2].val.ival);
(yyval.opval) = block_end((ps[-3].val.ival), (ps[-1].val.opval));
}
break;
case 144: /* optsigsubbody: PERLY_SEMICOLON */
#line 1055 "perly.y"
{ (yyval.opval) = NULL; }
break;
case 145: /* $@21: %empty */
#line 1060 "perly.y"
{ PL_parser->sig_seen = FALSE; }
break;
case 146: /* sigsubbody: remember optsubsignature PERLY_BRACE_OPEN $@21 stmtseq PERLY_BRACE_CLOSE */
#line 1062 "perly.y"
{
if (parser->copline > (line_t)(ps[-3].val.ival))
parser->copline = (line_t)(ps[-3].val.ival);
(yyval.opval) = block_end((ps[-5].val.ival),
op_append_list(OP_LINESEQ, (ps[-4].val.opval), (ps[-1].val.opval)));
}
break;
case 147: /* expr: expr ANDOP expr */
#line 1073 "perly.y"
{ (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
break;
case 148: /* expr: expr PLUGIN_LOGICAL_AND_LOW_OP expr */
#line 1075 "perly.y"
{ (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
break;
case 149: /* expr: expr OROP expr */
#line 1077 "perly.y"
{ (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); }
break;
case 150: /* expr: expr PLUGIN_LOGICAL_OR_LOW_OP expr */
#line 1079 "perly.y"
{ (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
break;
case 152: /* listexpr: listexpr PERLY_COMMA */
#line 1085 "perly.y"
{ (yyval.opval) = (ps[-1].val.opval); }
break;
case 153: /* listexpr: listexpr PERLY_COMMA term */
#line 1087 "perly.y"
{
OP* term = (ps[0].val.opval);
(yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), term);
}
break;
case 155: /* listop: LSTOP indirob listexpr */
#line 1096 "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)) );
}
break;
case 156: /* listop: FUNC PERLY_PAREN_OPEN indirob expr PERLY_PAREN_CLOSE */
#line 1100 "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)) );
}
break;
case 157: /* listop: term ARROW methodname PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE */
#line 1104 "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)),
newMETHOP(OP_METHOD, 0, (ps[-3].val.opval))));
}
break;
case 158: /* listop: term ARROW methodname */
#line 1110 "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))));
}
break;
case 159: /* listop: METHCALL0 indirob optlistexpr */
#line 1115 "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)),
newMETHOP(OP_METHOD, 0, (ps[-2].val.opval))));
}
break;
case 160: /* listop: METHCALL indirob PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE */
#line 1121 "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)),
newMETHOP(OP_METHOD, 0, (ps[-4].val.opval))));
}
break;
case 161: /* listop: LSTOP optlistexpr */
#line 1127 "perly.y"
{ (yyval.opval) = op_convert_list((ps[-1].val.ival), 0, (ps[0].val.opval)); }
break;
case 162: /* listop: FUNC PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE */
#line 1129 "perly.y"
{ (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
break;
case 163: /* listop: FUNC SUBLEXSTART optexpr SUBLEXEND */
#line 1131 "perly.y"
{ (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
break;
case 164: /* @22: %empty */
#line 1133 "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 */
(ps[0].val.opval) = NULL;
}
break;
case 165: /* listop: LSTOPSUB startanonsub block @22 optlistexpr */
#line 1139 "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)));
}
break;
case 168: /* subscripted: gelem PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE */
#line 1154 "perly.y"
{ (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[-4].val.opval), scalar((ps[-2].val.opval))); }
break;
case 169: /* subscripted: scalar PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */
#line 1156 "perly.y"
{ (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[-3].val.opval)), scalar((ps[-1].val.opval)));
}
break;
case 170: /* subscripted: term ARROW PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */
#line 1159 "perly.y"
{ (yyval.opval) = newBINOP(OP_AELEM, 0,
ref(newAVREF((ps[-4].val.opval)),OP_RV2AV),
scalar((ps[-1].val.opval)));
}
break;
case 171: /* subscripted: subscripted PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */
#line 1164 "perly.y"
{ (yyval.opval) = newBINOP(OP_AELEM, 0,
ref(newAVREF((ps[-3].val.opval)),OP_RV2AV),
scalar((ps[-1].val.opval)));
}
break;
case 172: /* subscripted: scalar PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE */
#line 1169 "perly.y"
{ (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[-4].val.opval)), jmaybe((ps[-2].val.opval)));
}
break;
case 173: /* subscripted: term ARROW PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE */
#line 1172 "perly.y"
{ (yyval.opval) = newBINOP(OP_HELEM, 0,
ref(newHVREF((ps[-5].val.opval)),OP_RV2HV),
jmaybe((ps[-2].val.opval))); }
break;
case 174: /* subscripted: subscripted PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE */
#line 1176 "perly.y"
{ (yyval.opval) = newBINOP(OP_HELEM, 0,
ref(newHVREF((ps[-4].val.opval)),OP_RV2HV),
jmaybe((ps[-2].val.opval))); }
break;
case 175: /* subscripted: term ARROW PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */
#line 1180 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
newCVREF(0, scalar((ps[-3].val.opval))));
if (parser->expect == XBLOCK)
parser->expect = XOPERATOR;
}
break;
case 176: /* subscripted: term ARROW PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE */
#line 1186 "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)))));
if (parser->expect == XBLOCK)
parser->expect = XOPERATOR;
}
break;
case 177: /* subscripted: subscripted PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE */
#line 1194 "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)))));
if (parser->expect == XBLOCK)
parser->expect = XOPERATOR;
}
break;
case 178: /* subscripted: subscripted PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */
#line 1201 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
newCVREF(0, scalar((ps[-2].val.opval))));
if (parser->expect == XBLOCK)
parser->expect = XOPERATOR;
}
break;
case 179: /* subscripted: PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */
#line 1207 "perly.y"
{ (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-4].val.opval)); }
break;
case 180: /* subscripted: QWLIST PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */
#line 1209 "perly.y"
{ (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-3].val.opval)); }
break;
case 181: /* subscripted: PERLY_PAREN_OPEN PERLY_PAREN_CLOSE PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */
#line 1211 "perly.y"
{ (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), NULL); }
break;
case 182: /* termbinop: term PLUGIN_HIGH_OP term */
#line 1216 "perly.y"
{ (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
break;
case 183: /* termbinop: term ASSIGNOP term */
#line 1218 "perly.y"
{ (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[-2].val.opval), (ps[-1].val.ival), (ps[0].val.opval)); }
break;
case 184: /* termbinop: term PLUGIN_ASSIGN_OP term */
#line 1220 "perly.y"
{ (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
break;
case 185: /* termbinop: term POWOP term */
#line 1222 "perly.y"
{ (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
break;
case 186: /* termbinop: term PLUGIN_POW_OP term */
#line 1224 "perly.y"
{ (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
break;
case 187: /* termbinop: term MULOP term */
#line 1226 "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)));
}
break;
case 188: /* termbinop: term PLUGIN_MUL_OP term */
#line 1231 "perly.y"
{ (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
break;
case 189: /* termbinop: term ADDOP term */
#line 1233 "perly.y"
{ (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
break;
case 190: /* termbinop: term PLUGIN_ADD_OP term */
#line 1235 "perly.y"
{ (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
break;
case 191: /* termbinop: term SHIFTOP term */
#line 1237 "perly.y"
{ (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
break;
case 192: /* termbinop: termrelop */
#line 1239 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 193: /* termbinop: termeqop */
#line 1241 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 194: /* termbinop: term BITANDOP term */
#line 1243 "perly.y"
{ (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
break;
case 195: /* termbinop: term BITOROP term */
#line 1245 "perly.y"
{ (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
break;
case 196: /* termbinop: term DOTDOT term */
#line 1247 "perly.y"
{ (yyval.opval) = newRANGE((ps[-1].val.ival), scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
break;
case 197: /* termbinop: term ANDAND term */
#line 1249 "perly.y"
{ (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
break;
case 198: /* termbinop: term PLUGIN_LOGICAL_AND_OP term */
#line 1251 "perly.y"
{ (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
break;
case 199: /* termbinop: term OROR term */
#line 1253 "perly.y"
{ (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); }
break;
case 200: /* termbinop: term PLUGIN_LOGICAL_OR_OP term */
#line 1255 "perly.y"
{ (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
break;
case 201: /* termbinop: term DORDOR term */
#line 1257 "perly.y"
{ (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
break;
case 202: /* termbinop: term MATCHOP term */
#line 1259 "perly.y"
{ (yyval.opval) = bind_match((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
break;
case 203: /* termbinop: term PLUGIN_LOW_OP term */
#line 1261 "perly.y"
{ (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
break;
case 204: /* termrelop: relopchain */
#line 1265 "perly.y"
{ (yyval.opval) = cmpchain_finish((ps[0].val.opval)); }
break;
case 205: /* termrelop: term NCRELOP term */
#line 1267 "perly.y"
{ (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
break;
case 206: /* termrelop: termrelop NCRELOP */
#line 1269 "perly.y"
{ yyerror("syntax error"); YYERROR; }
break;
case 207: /* termrelop: termrelop CHRELOP */
#line 1271 "perly.y"
{ yyerror("syntax error"); YYERROR; }
break;
case 208: /* termrelop: term PLUGIN_REL_OP term */
#line 1273 "perly.y"
{ (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); }
break;
case 209: /* relopchain: term CHRELOP term */
#line 1277 "perly.y"
{ (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
break;
case 210: /* relopchain: relopchain CHRELOP term */
#line 1279 "perly.y"
{ (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
break;
case 211: /* termeqop: eqopchain */
#line 1283 "perly.y"
{ (yyval.opval) = cmpchain_finish((ps[0].val.opval)); }
break;
case 212: /* termeqop: term NCEQOP term */
#line 1285 "perly.y"
{ (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
break;
case 213: /* termeqop: termeqop NCEQOP */
#line 1287 "perly.y"
{ yyerror("syntax error"); YYERROR; }
break;
case 214: /* termeqop: termeqop CHEQOP */
#line 1289 "perly.y"
{ yyerror("syntax error"); YYERROR; }
break;
case 215: /* eqopchain: term CHEQOP term */
#line 1293 "perly.y"
{ (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
break;
case 216: /* eqopchain: eqopchain CHEQOP term */
#line 1295 "perly.y"
{ (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
break;
case 217: /* termunop: PERLY_MINUS term */
#line 1300 "perly.y"
{ (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[0].val.opval))); }
break;
case 218: /* termunop: PERLY_PLUS term */
#line 1302 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 219: /* termunop: PERLY_EXCLAMATION_MARK term */
#line 1305 "perly.y"
{ (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
break;
case 220: /* termunop: PERLY_TILDE term */
#line 1307 "perly.y"
{ (yyval.opval) = newUNOP((ps[-1].val.ival), 0, scalar((ps[0].val.opval))); }
break;
case 221: /* termunop: term POSTINC */
#line 1309 "perly.y"
{ (yyval.opval) = newUNOP(OP_POSTINC, 0,
op_lvalue(scalar((ps[-1].val.opval)), OP_POSTINC)); }
break;
case 222: /* termunop: term POSTDEC */
#line 1312 "perly.y"
{ (yyval.opval) = newUNOP(OP_POSTDEC, 0,
op_lvalue(scalar((ps[-1].val.opval)), OP_POSTDEC));}
break;
case 223: /* termunop: term POSTJOIN */
#line 1315 "perly.y"
{ (yyval.opval) = op_convert_list(OP_JOIN, 0,
op_append_elem(
OP_LIST,
newSVREF(scalar(
newSVOP(OP_CONST,0,
newSVpvs("\""))
)),
(ps[-1].val.opval)
));
}
break;
case 224: /* termunop: PREINC term */
#line 1326 "perly.y"
{ (yyval.opval) = newUNOP(OP_PREINC, 0,
op_lvalue(scalar((ps[0].val.opval)), OP_PREINC)); }
break;
case 225: /* termunop: PREDEC term */
#line 1329 "perly.y"
{ (yyval.opval) = newUNOP(OP_PREDEC, 0,
op_lvalue(scalar((ps[0].val.opval)), OP_PREDEC)); }
break;
case 226: /* anonymous: PERLY_BRACKET_OPEN optexpr PERLY_BRACKET_CLOSE */
#line 1337 "perly.y"
{ (yyval.opval) = newANONLIST((ps[-1].val.opval)); }
break;
case 227: /* anonymous: HASHBRACK optexpr PERLY_SEMICOLON PERLY_BRACE_CLOSE */
#line 1339 "perly.y"
{ (yyval.opval) = newANONHASH((ps[-2].val.opval)); }
break;
case 228: /* anonymous: KW_SUB_anon startanonsub proto subattrlist subbody */
#line 1341 "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 229: /* anonymous: KW_SUB_anon_sig startanonsub subattrlist sigsubbody */
#line 1344 "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 230: /* anonymous: KW_METHOD_anon startanonmethod subattrlist sigsubbody */
#line 1347 "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 231: /* termdo: KW_DO term */
#line 1355 "perly.y"
{ (yyval.opval) = dofile((ps[0].val.opval), (ps[-1].val.ival));}
break;
case 232: /* termdo: KW_DO block */
#line 1357 "perly.y"
{ (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[0].val.opval)));}
break;
case 237: /* term: term PERLY_QUESTION_MARK term PERLY_COLON term */
#line 1365 "perly.y"
{ (yyval.opval) = newCONDOP(0, (ps[-4].val.opval), (ps[-2].val.opval), (ps[0].val.opval)); }
break;
case 238: /* term: REFGEN term */
#line 1367 "perly.y"
{ (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[0].val.opval)); }
break;
case 239: /* term: myattrterm */
#line 1369 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 240: /* term: KW_LOCAL term */
#line 1371 "perly.y"
{ (yyval.opval) = localize((ps[0].val.opval),0); }
break;
case 241: /* term: PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE */
#line 1373 "perly.y"
{ (yyval.opval) = sawparens((ps[-1].val.opval)); }
break;
case 242: /* term: QWLIST */
#line 1375 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 243: /* term: PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */
#line 1377 "perly.y"
{ (yyval.opval) = sawparens(newNULLLIST()); }
break;
case 244: /* term: scalar */
#line 1379 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 245: /* term: star */
#line 1381 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 246: /* term: hsh */
#line 1383 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 247: /* term: ary */
#line 1385 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 248: /* term: arylen */
#line 1387 "perly.y"
{ (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[0].val.opval), OP_AV2ARYLEN));}
break;
case 249: /* term: subscripted */
#line 1389 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 250: /* term: sliceme PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */
#line 1391 "perly.y"
{ (yyval.opval) = op_prepend_elem(OP_ASLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_ASLICE, 0,
list((ps[-1].val.opval)),
ref((ps[-3].val.opval), OP_ASLICE)));
if ((yyval.opval) && (ps[-3].val.opval))
(yyval.opval)->op_private |=
(ps[-3].val.opval)->op_private & OPpSLICEWARNING;
}
break;
case 251: /* term: kvslice PERLY_BRACKET_OPEN expr PERLY_BRACKET_CLOSE */
#line 1401 "perly.y"
{ (yyval.opval) = op_prepend_elem(OP_KVASLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_KVASLICE, 0,
list((ps[-1].val.opval)),
ref(oopsAV((ps[-3].val.opval)), OP_KVASLICE)));
if ((yyval.opval) && (ps[-3].val.opval))
(yyval.opval)->op_private |=
(ps[-3].val.opval)->op_private & OPpSLICEWARNING;
}
break;
case 252: /* term: sliceme PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE */
#line 1411 "perly.y"
{ (yyval.opval) = op_prepend_elem(OP_HSLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_HSLICE, 0,
list((ps[-2].val.opval)),
ref(oopsHV((ps[-4].val.opval)), OP_HSLICE)));
if ((yyval.opval) && (ps[-4].val.opval))
(yyval.opval)->op_private |=
(ps[-4].val.opval)->op_private & OPpSLICEWARNING;
}
break;
case 253: /* term: kvslice PERLY_BRACE_OPEN expr PERLY_SEMICOLON PERLY_BRACE_CLOSE */
#line 1421 "perly.y"
{ (yyval.opval) = op_prepend_elem(OP_KVHSLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_KVHSLICE, 0,
list((ps[-2].val.opval)),
ref((ps[-4].val.opval), OP_KVHSLICE)));
if ((yyval.opval) && (ps[-4].val.opval))
(yyval.opval)->op_private |=
(ps[-4].val.opval)->op_private & OPpSLICEWARNING;
}
break;
case 254: /* term: THING */
#line 1431 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 255: /* term: amper */
#line 1433 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[0].val.opval))); }
break;
case 256: /* term: amper PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */
#line 1435 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[-2].val.opval)));
}
break;
case 257: /* term: amper PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE */
#line 1438 "perly.y"
{
(yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
op_append_elem(OP_LIST, (ps[-1].val.opval), scalar((ps[-3].val.opval))));
}
break;
case 258: /* term: NOAMP subname optlistexpr */
#line 1443 "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 259: /* term: term ARROW PERLY_DOLLAR PERLY_STAR */
#line 1447 "perly.y"
{ (yyval.opval) = newSVREF((ps[-3].val.opval)); }
break;
case 260: /* term: term ARROW PERLY_SNAIL PERLY_STAR */
#line 1449 "perly.y"
{ (yyval.opval) = newAVREF((ps[-3].val.opval)); }
break;
case 261: /* term: term ARROW PERLY_PERCENT_SIGN PERLY_STAR */
#line 1451 "perly.y"
{ (yyval.opval) = newHVREF((ps[-3].val.opval)); }
break;
case 262: /* term: term ARROW PERLY_AMPERSAND PERLY_STAR */
#line 1453 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, 0,
scalar(newCVREF((ps[-1].val.ival),(ps[-3].val.opval)))); }
break;
case 263: /* term: term ARROW PERLY_STAR PERLY_STAR */
#line 1456 "perly.y"
{ (yyval.opval) = newGVREF(0,(ps[-3].val.opval)); }
break;
case 264: /* term: LOOPEX */
#line 1458 "perly.y"
{ (yyval.opval) = newOP((ps[0].val.ival), OPf_SPECIAL);
PL_hints |= HINT_BLOCK_SCOPE; }
break;
case 265: /* term: LOOPEX term */
#line 1461 "perly.y"
{ (yyval.opval) = newLOOPEX((ps[-1].val.ival),(ps[0].val.opval)); }
break;
case 266: /* term: NOTOP listexpr */
#line 1463 "perly.y"
{ (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
break;
case 267: /* term: UNIOP */
#line 1465 "perly.y"
{ (yyval.opval) = newOP((ps[0].val.ival), 0); }
break;
case 268: /* term: UNIOP block */
#line 1467 "perly.y"
{ (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
break;
case 269: /* term: UNIOP term */
#line 1469 "perly.y"
{ (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
break;
case 270: /* term: KW_REQUIRE */
#line 1471 "perly.y"
{ (yyval.opval) = newOP(OP_REQUIRE, (ps[0].val.ival) ? OPf_SPECIAL : 0); }
break;
case 271: /* term: KW_REQUIRE term */
#line 1473 "perly.y"
{ (yyval.opval) = newUNOP(OP_REQUIRE, (ps[-1].val.ival) ? OPf_SPECIAL : 0, (ps[0].val.opval)); }
break;
case 272: /* term: UNIOPSUB */
#line 1475 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
break;
case 273: /* term: UNIOPSUB term */
#line 1477 "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 274: /* term: FUNC0 */
#line 1480 "perly.y"
{ (yyval.opval) = newOP((ps[0].val.ival), 0); }
break;
case 275: /* term: FUNC0 PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */
#line 1482 "perly.y"
{ (yyval.opval) = newOP((ps[-2].val.ival), 0);}
break;
case 276: /* term: FUNC0OP */
#line 1484 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 277: /* term: FUNC0OP PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */
#line 1486 "perly.y"
{ (yyval.opval) = (ps[-2].val.opval); }
break;
case 278: /* term: FUNC0SUB */
#line 1488 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
break;
case 279: /* term: FUNC1 PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */
#line 1490 "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); }
break;
case 280: /* term: FUNC1 PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE */
#line 1494 "perly.y"
{ (yyval.opval) = newUNOP((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
break;
case 281: /* @23: %empty */
#line 1496 "perly.y"
{
if ( (ps[0].val.opval)->op_type != OP_TRANS
&& (ps[0].val.opval)->op_type != OP_TRANSR
&& (((PMOP*)(ps[0].val.opval))->op_pmflags & PMf_HAS_CV))
{
(yyval.ival) = start_subparse(FALSE, CVf_ANON);
SAVEFREESV(PL_compcv);
} else
(yyval.ival) = 0;
}
break;
case 282: /* term: PMFUNC @23 SUBLEXSTART listexpr optrepl SUBLEXEND */
#line 1507 "perly.y"
{ (yyval.opval) = pmruntime((ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), 1, (ps[-4].val.ival)); }
break;
case 286: /* myattrterm: KW_MY myterm myattrlist */
#line 1516 "perly.y"
{ (yyval.opval) = my_attrs((ps[-1].val.opval),(ps[0].val.opval)); }
break;
case 287: /* myattrterm: KW_MY myterm */
#line 1518 "perly.y"
{ (yyval.opval) = localize((ps[0].val.opval),1); }
break;
case 288: /* myattrterm: KW_MY REFGEN myterm myattrlist */
#line 1520 "perly.y"
{ (yyval.opval) = newUNOP(OP_REFGEN, 0, my_attrs((ps[-1].val.opval),(ps[0].val.opval))); }
break;
case 289: /* myattrterm: KW_MY REFGEN term */
#line 1522 "perly.y"
{ (yyval.opval) = newUNOP(OP_REFGEN, 0, localize((ps[0].val.opval),1)); }
break;
case 290: /* myterm: PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE */
#line 1527 "perly.y"
{ (yyval.opval) = sawparens((ps[-1].val.opval)); }
break;
case 291: /* myterm: PERLY_PAREN_OPEN PERLY_PAREN_CLOSE */
#line 1529 "perly.y"
{ (yyval.opval) = sawparens(newNULLLIST()); }
break;
case 292: /* myterm: scalar */
#line 1532 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 293: /* myterm: hsh */
#line 1534 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 294: /* myterm: ary */
#line 1536 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 295: /* fieldvar: scalar */
#line 1541 "perly.y"
{
(yyval.pval) = PadnamelistARRAY(PL_comppad_name)[(ps[0].val.opval)->op_targ];
op_free((ps[0].val.opval));
}
break;
case 296: /* fieldvar: hsh */
#line 1546 "perly.y"
{
(yyval.pval) = PadnamelistARRAY(PL_comppad_name)[(ps[0].val.opval)->op_targ];
op_free((ps[0].val.opval));
}
break;
case 297: /* fieldvar: ary */
#line 1551 "perly.y"
{
(yyval.pval) = PadnamelistARRAY(PL_comppad_name)[(ps[0].val.opval)->op_targ];
op_free((ps[0].val.opval));
}
break;
case 298: /* optfieldattrlist: COLONATTR THING */
#line 1559 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 299: /* optfieldattrlist: COLONATTR */
#line 1561 "perly.y"
{ (yyval.opval) = NULL; }
break;
case 301: /* fielddecl: KW_FIELD fieldvar optfieldattrlist */
#line 1567 "perly.y"
{
parser->in_my = 0;
if((ps[0].val.opval))
class_apply_field_attributes((PADNAME *)(ps[-1].val.pval), (ps[0].val.opval));
(yyval.opval) = newOP(OP_NULL, 0);
}
break;
case 302: /* $@24: %empty */
#line 1574 "perly.y"
{
parser->in_my = 0;
if((ps[-1].val.opval))
class_apply_field_attributes((PADNAME *)(ps[-2].val.pval), (ps[-1].val.opval));
ENTER;
class_prepare_initfield_parse();
}
break;
case 303: /* fielddecl: KW_FIELD fieldvar optfieldattrlist ASSIGNOP $@24 term */
#line 1582 "perly.y"
{
class_set_field_defop((PADNAME *)(ps[-4].val.pval), (ps[-2].val.ival), (ps[0].val.opval));
LEAVE;
(yyval.opval) = newOP(OP_NULL, 0);
}
break;
case 309: /* optrepl: PERLY_SLASH expr */
#line 1602 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
case 310: /* my_scalar: scalar */
#line 1608 "perly.y"
{ parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); }
break;
case 311: /* list_of_scalars: list_of_scalars PERLY_COMMA */
#line 1613 "perly.y"
{ (yyval.opval) = (ps[-1].val.opval); }
break;
case 312: /* list_of_scalars: list_of_scalars PERLY_COMMA scalar */
#line 1615 "perly.y"
{
(yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), (ps[0].val.opval));
}
break;
case 314: /* my_list_of_scalars: list_of_scalars */
#line 1622 "perly.y"
{ parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); }
break;
case 322: /* amper: PERLY_AMPERSAND indirob */
#line 1639 "perly.y"
{ (yyval.opval) = newCVREF((ps[-1].val.ival),(ps[0].val.opval)); }
break;
case 323: /* scalar: PERLY_DOLLAR indirob */
#line 1643 "perly.y"
{ (yyval.opval) = newSVREF((ps[0].val.opval)); }
break;
case 324: /* ary: PERLY_SNAIL indirob */
#line 1647 "perly.y"
{ (yyval.opval) = newAVREF((ps[0].val.opval));
if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival);
}
break;
case 325: /* hsh: PERLY_PERCENT_SIGN indirob */
#line 1653 "perly.y"
{ (yyval.opval) = newHVREF((ps[0].val.opval));
if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival);
}
break;
case 326: /* arylen: DOLSHARP indirob */
#line 1659 "perly.y"
{ (yyval.opval) = newAVREF((ps[0].val.opval)); }
break;
case 327: /* arylen: term ARROW DOLSHARP PERLY_STAR */
#line 1661 "perly.y"
{ (yyval.opval) = newAVREF((ps[-3].val.opval)); }
break;
case 328: /* star: PERLY_STAR indirob */
#line 1665 "perly.y"
{ (yyval.opval) = newGVREF(0,(ps[0].val.opval)); }
break;
case 330: /* sliceme: term ARROW PERLY_SNAIL */
#line 1670 "perly.y"
{ (yyval.opval) = newAVREF((ps[-2].val.opval)); }
break;
case 332: /* kvslice: term ARROW PERLY_PERCENT_SIGN */
#line 1675 "perly.y"
{ (yyval.opval) = newHVREF((ps[-2].val.opval)); }
break;
case 334: /* gelem: term ARROW PERLY_STAR */
#line 1680 "perly.y"
{ (yyval.opval) = newGVREF(0,(ps[-2].val.opval)); }
break;
case 335: /* indirob: BAREWORD */
#line 1685 "perly.y"
{ (yyval.opval) = scalar((ps[0].val.opval)); }
break;
case 336: /* indirob: scalar */
#line 1687 "perly.y"
{ (yyval.opval) = scalar((ps[0].val.opval)); }
break;
case 337: /* indirob: block */
#line 1689 "perly.y"
{ (yyval.opval) = op_scope((ps[0].val.opval)); }
break;
case 338: /* indirob: PRIVATEREF */
#line 1692 "perly.y"
{ (yyval.opval) = (ps[0].val.opval); }
break;
default: break;
/* Generated from:
* 823630846fc59cc2a19502726ec723b568eabded55fdc5e9722c600e1098779e perly.y
* acf1cbfd2545faeaaa58b1cf0cf9d7f98b5be0752eb7a54528ef904a9e2e1ca7 regen_perly.pl
* ex: set ro ft=c: */