This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Perl_scalar() tail-call optimise
authorDavid Mitchell <davem@iabyn.com>
Wed, 29 May 2019 10:03:26 +0000 (11:03 +0100)
committerDavid Mitchell <davem@iabyn.com>
Mon, 24 Jun 2019 10:40:07 +0000 (11:40 +0100)
commitdb18005b26986d1d422fcb53989eece313134db5
tree3c88d78c3917472cc1276693b65d5395ce903f7b
parentadb47cec409f1c82a623f7e218f477cb4829f2a6
Perl_scalar() tail-call optimise

The part of this function that scans the children of e.g.

    $scalar = do { void; void; scalar }

applying scalar context only to the last child: tail call optimise that
call to Perl_scalar().

It also adds some extra 'warnings' tests. An earlier attempt at this
patch caused some unrelated tests to start emitting spurious 'useless in
void context' messages, which are covered by the new tests.

This also showed up that the current method for updating PL_curcop
while descending optrees in Perl_scalar/scalarvoid/S_scalarseq is a bit
broken. It gets updated every time a newstate op is seen, but haphazardly
(and sometimes wrongly) restored to &PL_compiling when going back up the
tree. One of the tests is TODO based on PL_curcop being wrong and so the
'no warnings "void"' leaking into an outer scope.

This commit maintains the status quo.
op.c
t/lib/warnings/op