/* An ordinary block */
block : '{' remember lineseq '}'
- { if (PL_copline > (line_t)IVAL($1))
- PL_copline = (line_t)IVAL($1);
+ { if (PL_parser->copline > (line_t)IVAL($1))
+ PL_parser->copline = (line_t)IVAL($1);
$$ = block_end($2, $3);
TOKEN_GETMAD($1,$$,'{');
TOKEN_GETMAD($4,$$,'}');
progstart:
{
- PL_expect = XSTATE; $$ = block_start(TRUE);
+ PL_parser->expect = XSTATE; $$ = block_start(TRUE);
}
;
mblock : '{' mremember lineseq '}'
- { if (PL_copline > (line_t)IVAL($1))
- PL_copline = (line_t)IVAL($1);
+ { if (PL_parser->copline > (line_t)IVAL($1))
+ PL_parser->copline = (line_t)IVAL($1);
$$ = block_end($2, $3);
TOKEN_GETMAD($1,$$,'{');
TOKEN_GETMAD($4,$$,'}');
$$ = IF_MAD(
newOP(OP_NULL, 0),
Nullop);
- PL_copline = NOLINE;
+ PL_parser->copline = NOLINE;
TOKEN_FREE($1);
TOKEN_GETMAD($2,$$,';');
}
- PL_expect = XSTATE;
+ PL_parser->expect = XSTATE;
}
| label sideff ';'
{
$$ = newSTATEOP(0, PVAL($1), $2);
- PL_expect = XSTATE;
+ PL_parser->expect = XSTATE;
DO_MAD(
/* sideff might already have a nexstate */
OP* op = ((LISTOP*)$$)->op_first;
TOKEN_GETMAD($1,$$,'o');
}
| ELSIF '(' mexpr ')' mblock else
- { PL_copline = (line_t)IVAL($1);
+ { PL_parser->copline = (line_t)IVAL($1);
$$ = newCONDOP(0, $3, scope($5), $6);
PL_hints |= HINT_BLOCK_SCOPE;
TOKEN_GETMAD($1,$$,'I');
/* Real conditional expressions */
cond : IF '(' remember mexpr ')' mblock else
- { PL_copline = (line_t)IVAL($1);
+ { PL_parser->copline = (line_t)IVAL($1);
$$ = block_end($3,
newCONDOP(0, $4, scope($6), $7));
TOKEN_GETMAD($1,$$,'I');
TOKEN_GETMAD($5,$$,')');
}
| UNLESS '(' remember miexpr ')' mblock else
- { PL_copline = (line_t)IVAL($1);
+ { PL_parser->copline = (line_t)IVAL($1);
$$ = block_end($3,
newCONDOP(0, $4, scope($6), $7));
TOKEN_GETMAD($1,$$,'I');
/* Loops: while, until, for, and a bare block */
loop : label WHILE '(' remember texpr ')' mintro mblock cont
{ OP *innerop;
- PL_copline = (line_t)$2;
+ PL_parser->copline = (line_t)$2;
$$ = block_end($4,
newSTATEOP(0, PVAL($1),
innerop = newWHILEOP(0, 1, (LOOP*)Nullop,
| label UNTIL '(' remember iexpr ')' mintro mblock cont
{ OP *innerop;
- PL_copline = (line_t)$2;
+ PL_parser->copline = (line_t)$2;
$$ = block_end($4,
newSTATEOP(0, PVAL($1),
innerop = newWHILEOP(0, 1, (LOOP*)Nullop,
mblock
/* basically fake up an initialize-while lineseq */
{ OP *forop;
- PL_copline = (line_t)IVAL($2);
+ PL_parser->copline = (line_t)IVAL($2);
forop = newSTATEOP(0, PVAL($1),
newWHILEOP(0, 1, (LOOP*)Nullop,
IVAL($2), scalar($7),
#ifdef MAD
forop = newUNOP(OP_NULL, 0, append_elem(OP_LINESEQ,
newSTATEOP(0,
- (($1)->tk_lval.pval
- ?savepv(($1)->tk_lval.pval):Nullch),
- ($5 ? newOP(OP_NULL, 0) : $5) ),
+ CopLABEL_alloc(($1)->tk_lval.pval),
+ ($5 ? $5 : newOP(OP_NULL, 0)) ),
forop));
token_getmad($2,forop,'3');
#else
if ($5) {
forop = append_elem(OP_LINESEQ,
- newSTATEOP(0, ($1?savepv($1):Nullch),
- $5),
+ newSTATEOP(0, CopLABEL_alloc($1), $5),
forop);
}
/* Switch blocks */
switch : label GIVEN '(' remember mydefsv mexpr ')' mblock
- { PL_copline = (line_t) $2;
+ { PL_parser->copline = (line_t) $2;
$$ = block_end($4,
newSTATEOP(0, PVAL($1),
newGIVENOP($6, scope($8),
;
format : FORMAT startformsub formname block
- { SvREFCNT_inc(PL_compcv);
+ { SvREFCNT_inc_simple_void(PL_compcv);
#ifdef MAD
$$ = newFORM($2, $3, $4);
prepend_madprops($1->tk_mad, $$, 'F');
/* Unimplemented "my sub foo { }" */
mysubrout: MYSUB startsub subname proto subattrlist subbody
- { SvREFCNT_inc(PL_compcv);
+ { SvREFCNT_inc_simple_void(PL_compcv);
#ifdef MAD
$$ = newMYSUB($2, $3, $4, $5, $6);
token_getmad($1,$$,'d');
/* Subroutine definition */
subrout : SUB startsub subname proto subattrlist subbody
- { SvREFCNT_inc(PL_compcv);
+ { SvREFCNT_inc_simple_void(PL_compcv);
#ifdef MAD
OP* o = newSVOP(OP_ANONCODE, 0,
(SV*)newATTRSUB($2, $3, $4, $5, $6));
newOP(OP_NULL,0),
Nullop
);
- PL_expect = XSTATE;
+ PL_parser->expect = XSTATE;
TOKEN_GETMAD($1,$$,';');
}
;
use : USE startsub
{ CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
WORD WORD listexpr ';'
- { SvREFCNT_inc(PL_compcv);
+ { SvREFCNT_inc_simple_void(PL_compcv);
#ifdef MAD
$$ = utilize(IVAL($1), $2, $4, $5, $6);
token_getmad($1,$$,'o');
TOKEN_GETMAD($4,$$,')');
}
| LSTOPSUB startanonsub block /* sub f(&@); f { foo } ... */
- { SvREFCNT_inc(PL_compcv);
+ { SvREFCNT_inc_simple_void(PL_compcv);
$<opval>$ = newANONATTRSUB($2, 0, Nullop, $3); }
listexpr %prec LSTOP /* ... @bar */
{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
/* In this and all the hash accessors, ';' is
* provided by the tokeniser */
{ $$ = newBINOP(OP_GELEM, 0, $1, scalar($3));
- PL_expect = XOPERATOR;
+ PL_parser->expect = XOPERATOR;
TOKEN_GETMAD($2,$$,'{');
TOKEN_GETMAD($4,$$,';');
TOKEN_GETMAD($5,$$,'}');
}
| scalar '{' expr ';' '}' /* $foo->{bar();} */
{ $$ = newBINOP(OP_HELEM, 0, oopsHV($1), jmaybe($3));
- PL_expect = XOPERATOR;
+ PL_parser->expect = XOPERATOR;
TOKEN_GETMAD($2,$$,'{');
TOKEN_GETMAD($4,$$,';');
TOKEN_GETMAD($5,$$,'}');
{ $$ = newBINOP(OP_HELEM, 0,
ref(newHVREF($1),OP_RV2HV),
jmaybe($4));
- PL_expect = XOPERATOR;
+ PL_parser->expect = XOPERATOR;
TOKEN_GETMAD($2,$$,'a');
TOKEN_GETMAD($3,$$,'{');
TOKEN_GETMAD($5,$$,';');
{ $$ = newBINOP(OP_HELEM, 0,
ref(newHVREF($1),OP_RV2HV),
jmaybe($3));
- PL_expect = XOPERATOR;
+ PL_parser->expect = XOPERATOR;
TOKEN_GETMAD($2,$$,'{');
TOKEN_GETMAD($4,$$,';');
TOKEN_GETMAD($5,$$,'}');
TOKEN_GETMAD($3,$$,'}');
}
| ANONSUB startanonsub proto subattrlist block %prec '('
- { SvREFCNT_inc(PL_compcv);
+ { SvREFCNT_inc_simple_void(PL_compcv);
$$ = newANONATTRSUB($2, $3, $4, $5);
TOKEN_GETMAD($1,$$,'o');
OP_GETMAD($3,$$,'s');
newLISTOP(OP_HSLICE, 0,
list($3),
ref(oopsHV($1), OP_HSLICE)));
- PL_expect = XOPERATOR;
+ PL_parser->expect = XOPERATOR;
TOKEN_GETMAD($2,$$,'{');
TOKEN_GETMAD($4,$$,';');
TOKEN_GETMAD($5,$$,'}');
{ $$ = newUNOP(IVAL($1), 0, $2);
TOKEN_GETMAD($1,$$,'o');
}
- | REQUIRE /* require, $_ implied *//* FIMXE for MAD needed? */
- { $$ = newOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0); }
- | REQUIRE term /* require Foo *//* FIMXE for MAD needed? */
- { $$ = newUNOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0, $2); }
+ | REQUIRE /* require, $_ implied */
+ { $$ = newOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0);
+ TOKEN_GETMAD($1,$$,'o');
+ }
+ | REQUIRE term /* require Foo */
+ { $$ = newUNOP(OP_REQUIRE, $1 ? OPf_SPECIAL : 0, $2);
+ TOKEN_GETMAD($1,$$,'o');
+ }
| UNIOPSUB
{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($1)); }
| UNIOPSUB term /* Sub treated as unop */