X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/eea89386b3fb948a8b1eb5ea860ec0a970c9e559..0f9d53bbcafba2b30e50a1ad22c7759be170e14a:/toke.c diff --git a/toke.c b/toke.c index 388b272..4910b6b 100644 --- a/toke.c +++ b/toke.c @@ -1252,7 +1252,7 @@ buffer has reached the end of the input text. */ #define LEX_FAKE_EOF 0x80000000 -#define LEX_NO_TERM 0x40000000 +#define LEX_NO_TERM 0x40000000 /* here-doc */ bool Perl_lex_next_chunk(pTHX_ U32 flags) @@ -1266,6 +1266,8 @@ Perl_lex_next_chunk(pTHX_ U32 flags) bool got_some; if (flags & ~(LEX_KEEP_PREVIOUS|LEX_FAKE_EOF|LEX_NO_TERM)) Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_next_chunk"); + if (!(flags & LEX_NO_TERM) && PL_lex_inwhat) + return FALSE; linestr = PL_parser->linestr; buf = SvPVX(linestr); if (!(flags & LEX_KEEP_PREVIOUS) && @@ -1804,7 +1806,7 @@ S_skipspace_flags(pTHX_ char *s, U32 flags) STRLEN bufptr_pos = PL_bufptr - SvPVX(PL_linestr); PL_bufptr = s; lex_read_space(flags | LEX_KEEP_PREVIOUS | - (PL_sublex_info.sub_inwhat || PL_lex_state == LEX_FORMLINE ? + (PL_lex_inwhat || PL_lex_state == LEX_FORMLINE ? LEX_NO_NEXT_CHUNK : 0)); s = PL_bufptr; PL_bufptr = SvPVX(PL_linestr) + bufptr_pos; @@ -1907,6 +1909,7 @@ S_force_next(pTHX_ I32 type) tokereport(type, &NEXTVAL_NEXTTOKE); } #endif + assert(PL_nexttoke < C_ARRAY_LENGTH(PL_nexttype)); PL_nexttype[PL_nexttoke] = type; PL_nexttoke++; if (PL_lex_state != LEX_KNOWNEXT) { @@ -2483,7 +2486,6 @@ S_sublex_done(pTHX) PL_bufend = SvPVX(PL_linestr); PL_bufend += SvCUR(PL_linestr); PL_expect = XOPERATOR; - PL_sublex_info.sub_inwhat = 0; return ')'; } } @@ -4311,13 +4313,8 @@ Perl_yylex(pTHX) SvREFCNT_dec(tmp); } ); - switch (PL_lex_state) { - case LEX_NORMAL: - case LEX_INTERPNORMAL: - break; - /* when we've already built the next token, just pull it out of the queue */ - case LEX_KNOWNEXT: + if (PL_nexttoke) { PL_nexttoke--; pl_yylval = PL_nextval[PL_nexttoke]; if (!PL_nexttoke) { @@ -4342,6 +4339,12 @@ Perl_yylex(pTHX) } return REPORT(next_type == 'p' ? pending_ident() : next_type); } + } + + switch (PL_lex_state) { + case LEX_NORMAL: + case LEX_INTERPNORMAL: + break; /* interpolated case modifiers like \L \U, including \Q and \E. when we get here, PL_bufptr is at the \ @@ -4621,7 +4624,8 @@ Perl_yylex(pTHX) case 26: goto fake_eof; /* emulate EOF on ^D or ^Z */ case 0: - if (!PL_rsfp && (!PL_parser->filtered || s+1 < PL_bufend)) { + if ((!PL_rsfp || PL_lex_inwhat) + && (!PL_parser->filtered || s+1 < PL_bufend)) { PL_last_uni = 0; PL_last_lop = 0; if (PL_lex_brackets && @@ -4960,7 +4964,6 @@ Perl_yylex(pTHX) } if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) { PL_lex_state = LEX_FORMLINE; - NEXTVAL_NEXTTOKE.ival = 0; force_next(FORMRBRACK); TOKEN(';'); } @@ -5003,7 +5006,6 @@ Perl_yylex(pTHX) incline(s); if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) { PL_lex_state = LEX_FORMLINE; - NEXTVAL_NEXTTOKE.ival = 0; force_next(FORMRBRACK); TOKEN(';'); }