In perl.git, the branch blead has been updated <http://perl5.git.perl.org/perl.git/commitdiff/83a85f49e265a458a481a9dc402dd3bdd30ae457?hp=47fb2434438e67771e77bd3fb9733cd75cb7cf7d>
- Log ----------------------------------------------------------------- commit 83a85f49e265a458a481a9dc402dd3bdd30ae457 Author: Father Chrysostomos <[email protected]> Date: Sun Feb 1 14:04:33 2015 -0800 [perl #123711] Fix crash with 0-5x-l{0} perl-5.8.0-117-g6f33ba7, which added the XTERMORDORDOR hack, did not change the leftbracket code to treat XTERMORDORDOR the same way as XTERM, so -l {0} and getc {0} (among other ops) were treating {...} as a block, rather than an anonymous hash. This was not, however, being turned into a real block with enter/leave ops to protect the stack, so the nextstate op was corrupting the stack and possibly freeing mor- tals in use. This commit makes the leftbracket code check for XTERMORDORDOR and treat it like XTERM, so that -l {0} once more creates an anonymous hash. There is really no way to get to that hash, though, so all I can test for is the crash. ----------------------------------------------------------------------- Summary of changes: t/base/lex.t | 3 +++ toke.c | 1 + 2 files changed, 4 insertions(+) diff --git a/t/base/lex.t b/t/base/lex.t index c917d4f..f938168 100644 --- a/t/base/lex.t +++ b/t/base/lex.t @@ -482,3 +482,6 @@ print "not " unless &{sub :lvalue { "a" }} eq "a"; print "ok $test - &{sub :lvalue...}\n"; $test++; print "not " unless ref +(map{sub :lvalue { "a" }} 1)[0] eq "CODE"; print "ok $test - map{sub :lvalue...}\n"; $test++; + +# Used to crash [perl #123711] +0-5x-l{0}; diff --git a/toke.c b/toke.c index 2a9a34e..fb9db0f 100644 --- a/toke.c +++ b/toke.c @@ -5506,6 +5506,7 @@ Perl_yylex(pTHX) } switch (PL_expect) { case XTERM: + case XTERMORDORDOR: PL_lex_brackstack[PL_lex_brackets++] = XOPERATOR; PL_lex_allbrackets++; OPERATOR(HASHBRACK); -- Perl5 Master Repository
