In perl.git, the branch blead has been updated <http://perl5.git.perl.org/perl.git/commitdiff/0f9d53bbcafba2b30e50a1ad22c7759be170e14a?hp=d90f68193029ea3c44b13561f94dbc565e54b3f0>
- Log ----------------------------------------------------------------- commit 0f9d53bbcafba2b30e50a1ad22c7759be170e14a Author: Father Chrysostomos <[email protected]> Date: Sat Feb 21 22:24:20 2015 -0800 [perl #123893] Fix hang with "@{" Commit v5.21.8-320-ge47d32d stopped code interpolated into quote-like operators from reading more lines of input, by making lex_next_chunk ignore the open filehandle and return false. That causes this block under case 0 in yylex to loop: if (!lex_next_chunk(fake_eof)) { CopLINE_dec(PL_curcop); s = PL_bufptr; TOKEN(';'); /* not infinite loop because rsfp is NULL now */ } (rsfp is not null there.) This commit makes it check for quote-like operators above, in the same place where it checks whether the file is open, to avoid falling through to this code that can loop. This changes the syntax errors for a couple of cases recently added to t/op/lex.t, though I think the error output is now more consis- tent overall. ----------------------------------------------------------------------- Summary of changes: t/op/lex.t | 19 +++++++++++++++---- toke.c | 3 ++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/t/op/lex.t b/t/op/lex.t index 3207198..dffd0b2 100644 --- a/t/op/lex.t +++ b/t/op/lex.t @@ -7,7 +7,7 @@ use warnings; BEGIN { chdir 't' if -d 't'; require './test.pl'; } -plan(tests => 19); +plan(tests => 20); { no warnings 'deprecated'; @@ -154,15 +154,26 @@ gibberish fresh_perl_is( '/$a[/<<a', - "syntax error at - line 1, next char ;\n" . - "Can't find string terminator \"a\" anywhere before EOF at - line 1.\n", + "Missing right curly or square bracket at - line 1, within pattern\n" . + "syntax error at - line 1, at EOF\n" . + "Execution of - aborted due to compilation errors.\n", { stderr => 1 }, '/$a[/<<a with no newline [perl #123712]' ); fresh_perl_is( '/$a[m||/<<a', - "syntax error at - line 1, next char ;\n" . + "Missing right curly or square bracket at - line 1, within pattern\n" . + "syntax error at - line 1, at EOF\n" . "Execution of - aborted due to compilation errors.\n", { stderr => 1 }, '/$a[m||/<<a with no newline [perl #123712]' ); + +fresh_perl_is( + '"@{"', + "Missing right curly or square bracket at - line 1, within string\n" . + "syntax error at - line 1, at EOF\n" . + "Execution of - aborted due to compilation errors.\n", + { stderr => 1 }, + '"@{" [perl #123712]' +); diff --git a/toke.c b/toke.c index 9e0575c..4910b6b 100644 --- a/toke.c +++ b/toke.c @@ -4624,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 && -- Perl5 Master Repository
