This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #122995] Hang with while(1) in a sub-list
authorFather Chrysostomos <sprout@cpan.org>
Fri, 17 Oct 2014 00:44:56 +0000 (17:44 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 17 Oct 2014 00:44:56 +0000 (17:44 -0700)
commit0d42e778cfa0ef9c7315b82e62a6c9fe0cb1cec5
treeb17dda209f17b6c3fd932857c677b06649ed281c
parent0298c7603f0a7ee6e46fc9ebc8283c40ee2f6ad4
[perl #122995] Hang with while(1) in a sub-list

It was hanging at compile time in some cases, e.g.:

sub foo { () = ($a, my $b, ($c, do { while(1) {} })) }

The optimisation added in 5.20 to turn list+pushmark into null ops
when they are in list context (effectively making ($a,($b,$c)) equiva-
lent to ($a,$b,$c) with regard to which ops are executed) followed
op_next pointers to find the last op that was a kid of the sublist.

You can’t just follow op_next pointers like that, because it will loop
at compile time on infinite loops like while (1){}.

In this case, the last kid was being found in order to elide the erst-
while list op from the op_next chain, but that is not necessary, since
later OP_NULL handling takes care of it anyway.
op.c
t/op/list.t