This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #123802] Assertion failure with "\L\L"
authorFather Chrysostomos <sprout@cpan.org>
Sun, 1 Mar 2015 19:29:10 +0000 (11:29 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 1 Mar 2015 19:29:42 +0000 (11:29 -0800)
This is a follow-up to f4460c6f7a.  The check to see whether we are
in a quote-like operator needs to come before the call to sublex_done,
as sublex_done is just as problematic as doing SvIVX on a PV.  (See
479ae48e22f for details on why.)  Checking the type of PL_linestr is
not a reliable way to see whether we are in a quote-like op, so use
PL_in_what instead.

t/op/lex.t
toke.c

index d0fa3af..7785445 100644 (file)
@@ -7,7 +7,7 @@ use warnings;
 
 BEGIN { chdir 't' if -d 't'; require './test.pl'; }
 
-plan(tests => 21);
+plan(tests => 23);
 
 {
     no warnings 'deprecated';
@@ -185,3 +185,17 @@ fresh_perl_is(
    { stderr => 1 },
   '/$0{}/ with no newline [perl #123802]'
 );
+fresh_perl_is(
+  '"\L\L"',
+  'syntax error at - line 1, near "\L\L"' . "\n" .
+  "Execution of - aborted due to compilation errors.\n",
+   { stderr => 1 },
+  '"\L\L" with no newline [perl #123802]'
+);
+fresh_perl_is(
+  '<\L\L>',
+  'syntax error at - line 1, near "\L\L"' . "\n" .
+  "Execution of - aborted due to compilation errors.\n",
+   { stderr => 1 },
+  '<\L\L> with no newline [perl #123802]'
+);
diff --git a/toke.c b/toke.c
index 33ae20f..f7ad00d 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -4552,17 +4552,17 @@ Perl_yylex(pTHX)
            Perl_croak(aTHX_ "panic: INTERPCONCAT, lex_brackets=%ld",
                       (long) PL_lex_brackets);
 #endif
-       if (PL_bufptr == PL_bufend)
-           return REPORT(sublex_done());
-
-       /* Treat state as LEX_NORMAL if SvIVX is not valid on PL_linestr.
+       /* Treat state as LEX_NORMAL when not in an inner lexing scope.
           XXX This hack can be removed if we stop setting PL_lex_state to
           LEX_KNOWNEXT.  */
-       if (SvTYPE(PL_linestr) == SVt_PV) {
+       if (UNLIKELY(!PL_lex_inwhat)) {
            PL_lex_state = LEX_NORMAL;
            break;
        }
 
+       if (PL_bufptr == PL_bufend)
+           return REPORT(sublex_done());
+
        /* m'foo' still needs to be parsed for possible (?{...}) */
        if (SvIVX(PL_linestr) == '\'' && !PL_lex_inpat) {
            SV *sv = newSVsv(PL_linestr);