From: Zefram Date: Tue, 5 Jan 2010 21:57:36 +0000 (+0100) Subject: [perl #71748] Bleadperl f0e67a1 breaks CPAN: Template::Plugin::YAML::Encode 0.02 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=f09989092a6586d2bb4173c4c08882afef55b70f;p=p5sagit%2Fp5-mst-13.2.git [perl #71748] Bleadperl f0e67a1 breaks CPAN: Template::Plugin::YAML::Encode 0.02 Unsurprisingly, the nature of the bug is that I accidentally changed the logic of one of the several types of space skipping. Fix attached. --- diff --git a/t/comp/parser.t b/t/comp/parser.t index 16d7b82..8fd9453 100644 --- a/t/comp/parser.t +++ b/t/comp/parser.t @@ -3,7 +3,7 @@ # Checks if the parser behaves correctly in edge cases # (including weird syntax errors) -print "1..121\n"; +print "1..122\n"; sub failed { my ($got, $expected, $name) = @_; @@ -341,6 +341,18 @@ like($@, qr/BEGIN failed--compilation aborted/, 'BEGIN 7' ); is(defined &zlonk, '', 'but no body defined'); } +# bug #71748 +eval q{ + $_ = ""; + s/(.)/ + { + # + }->{$1}; + /e; + 1; +}; +is($@, "", "multiline whitespace inside substitute expression"); + # Add new tests HERE: # More awkward tests for #line. Keep these at the end, as they will screw diff --git a/toke.c b/toke.c index 4950958..1398439 100644 --- a/toke.c +++ b/toke.c @@ -1401,12 +1401,14 @@ chunk will not be discarded. =cut */ +#define LEX_NO_NEXT_CHUNK 0x80000000 + void Perl_lex_read_space(pTHX_ U32 flags) { char *s, *bufend; bool need_incline = 0; - if (flags & ~(LEX_KEEP_PREVIOUS)) + if (flags & ~(LEX_KEEP_PREVIOUS|LEX_NO_NEXT_CHUNK)) Perl_croak(aTHX_ "Lexing code internal error (%s)", "lex_read_space"); #ifdef PERL_MAD if (PL_skipwhite) { @@ -1439,6 +1441,8 @@ Perl_lex_read_space(pTHX_ U32 flags) if (PL_madskills) sv_catpvn(PL_skipwhite, PL_parser->bufptr, s-PL_parser->bufptr); #endif /* PERL_MAD */ + if (flags & LEX_NO_NEXT_CHUNK) + break; PL_parser->bufptr = s; CopLINE_inc(PL_curcop); got_more = lex_next_chunk(flags); @@ -1714,20 +1718,12 @@ S_skipspace(pTHX_ register char *s) if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) { while (s < PL_bufend && SPACE_OR_TAB(*s)) s++; - } else if (PL_sublex_info.sub_inwhat || PL_lex_state == LEX_FORMLINE) { - while (isSPACE(*s) && *s != '\n') - s++; - if (*s == '#') { - do { - s++; - } while (s != PL_bufend && *s != '\n'); - } - if (*s == '\n') - s++; } else { STRLEN bufptr_pos = PL_bufptr - SvPVX(PL_linestr); PL_bufptr = s; - lex_read_space(LEX_KEEP_PREVIOUS); + lex_read_space(LEX_KEEP_PREVIOUS | + (PL_sublex_info.sub_inwhat || PL_lex_state == LEX_FORMLINE ? + LEX_NO_NEXT_CHUNK : 0)); s = PL_bufptr; PL_bufptr = SvPVX(PL_linestr) + bufptr_pos; if (PL_linestart > PL_bufptr)