X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perly.y;h=edbcb19b36e6fd682630873e8195f19d5db61afa;hb=842c41230043ce99d4bf7b2c79aed85ce2908e89;hp=0616692470ab9521045189e15ec104f54795d1b0;hpb=6fa4d285bff5644bebb95aff09143322042282cc;p=p5sagit%2Fp5-mst-13.2.git diff --git a/perly.y b/perly.y index 0616692..edbcb19 100644 --- a/perly.y +++ b/perly.y @@ -73,6 +73,7 @@ %token WORD METHOD FUNCMETH THING PMFUNC PRIVATEREF %token FUNC0SUB UNIOPSUB LSTOPSUB +%token PLUGEXPR PLUGSTMT %token LABEL %token FORMAT SUB ANONSUB PACKAGE USE %token WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE FOR @@ -91,7 +92,7 @@ %type decl format subrout mysubrout package use peg -%type block mblock lineseq line loop cond else +%type block package_block mblock lineseq line loop cond else %type expr term subscripted scalar ary hsh arylen star amper sideff %type argexpr nexpr texpr iexpr mexpr mnexpr miexpr %type listexpr listexprcom indirob listop method @@ -157,7 +158,7 @@ remember: /* NULL */ /* start a full lexical scope */ ; mydefsv: /* NULL */ /* lexicalize $_ */ - { $$ = (I32) allocmy("$_"); } + { $$ = (I32) Perl_allocmy(aTHX_ STR_WITH_LEN("$_"), 0); } ; progstart: @@ -241,6 +242,13 @@ line : label cond } }) } + | 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); } ; /* An expression which may have a side-effect */ @@ -329,7 +337,7 @@ cont : /* NULL */ /* 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, @@ -342,7 +350,7 @@ loop : label WHILE '(' remember texpr ')' mintro mblock cont | 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, @@ -424,7 +432,7 @@ loop : label WHILE '(' remember texpr ')' mintro mblock cont /* 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), @@ -508,7 +516,9 @@ peg : PEG ; 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'); @@ -518,6 +528,10 @@ format : FORMAT startformsub formname block 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); + } } ; @@ -635,20 +649,43 @@ subbody : block { $$ = $1; } package : PACKAGE WORD WORD ';' { -/* Since no one seem to understand or use the MAD stuff, but Larry implies - * it shouldn't be removed, it's just commented out, and someone who - * understands it can come along later and fix it up. #ifdef MAD - (yyval.opval) = package((ps[(2) - (3)].val.opval)); - token_getmad((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o'); - token_getmad((ps[(3) - (3)].val.i_tkval),(yyval.opval),';'); + $$ = package($3); + token_getmad($1,$$,'o'); + if ($2) + package_version($2); + token_getmad($4,$$,';'); #else -*/ package($3); - if ($2) { - package_version($2); - } + if ($2) + package_version($2); $$ = (OP*)NULL; +#endif + } + ; + +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); } ; @@ -1246,6 +1283,7 @@ term : termbinop newSVOP(OP_CONST, 0, newSVpvs("Unimplemented"))); TOKEN_GETMAD($1,$$,'X'); } + | PLUGEXPR ; /* "my" declarations, with optional attributes */