%type <opval> decl format subrout mysubrout package use peg
-%type <opval> block mblock lineseq line loop cond else
+%type <opval> block package_block mblock lineseq line loop cond else
%type <opval> expr term subscripted scalar ary hsh arylen star amper sideff
%type <opval> argexpr nexpr texpr iexpr mexpr mnexpr miexpr
%type <opval> listexpr listexprcom indirob listop method
}
})
}
+ | package_block
+ { $$ = newSTATEOP(0, NULL,
+ newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
+ NOLINE, (OP*)NULL, $1,
+ (OP*)NULL, 0)); }
| label PLUGSTMT
{ $$ = newSTATEOP(0, PVAL($1), $2); }
;
/* Loops: while, until, for, and a bare block */
loop : label WHILE '(' remember texpr ')' mintro mblock cont
{ OP *innerop;
- PL_parser->copline = (line_t)$2;
+ PL_parser->copline = (line_t)IVAL($2);
$$ = block_end($4,
newSTATEOP(0, PVAL($1),
innerop = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
| label UNTIL '(' remember iexpr ')' mintro mblock cont
{ OP *innerop;
- PL_parser->copline = (line_t)$2;
+ PL_parser->copline = (line_t)IVAL($2);
$$ = block_end($4,
newSTATEOP(0, PVAL($1),
innerop = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
/* Switch blocks */
switch : label GIVEN '(' remember mydefsv mexpr ')' mblock
- { PL_parser->copline = (line_t) $2;
+ { PL_parser->copline = (line_t) IVAL($2);
$$ = block_end($4,
newSTATEOP(0, PVAL($1),
newGIVENOP($6, scope($8),
;
format : FORMAT startformsub formname block
- { SvREFCNT_inc_simple_void(PL_compcv);
+ {
+ CV *fmtcv = PL_compcv;
+ SvREFCNT_inc_simple_void(PL_compcv);
#ifdef MAD
$$ = newFORM($2, $3, $4);
prepend_madprops($1->tk_mad, $$, 'F');
newFORM($2, $3, $4);
$$ = (OP*)NULL;
#endif
+ if (CvOUTSIDE(fmtcv) && !CvUNIQUE(CvOUTSIDE(fmtcv))) {
+ SvREFCNT_inc_simple_void(fmtcv);
+ pad_add_anon((SV*)fmtcv, OP_NULL);
+ }
}
;
}
;
+package_block: PACKAGE WORD WORD '{' remember
+ {
+ int save_3_latefree = $3->op_latefree;
+ $3->op_latefree = 1;
+ package($3);
+ $3->op_latefree = save_3_latefree;
+ if ($2) {
+ int save_2_latefree = $2->op_latefree;
+ $2->op_latefree = 1;
+ package_version($2);
+ $2->op_latefree = save_2_latefree;
+ }
+ }
+ lineseq '}'
+ { if (PL_parser->copline > (line_t)IVAL($4))
+ PL_parser->copline = (line_t)IVAL($4);
+ $$ = block_end($5, $7);
+ TOKEN_GETMAD($4,$$,'{');
+ TOKEN_GETMAD($8,$$,'}');
+ op_free($3);
+ if ($2)
+ op_free($2);
+ }
+ ;
+
use : USE startsub
{ CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
WORD WORD listexpr ';'