This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
scalarvoid(): remove anti-recursion deferring
authorDavid Mitchell <davem@iabyn.com>
Fri, 5 Apr 2019 14:38:24 +0000 (15:38 +0100)
committerDavid Mitchell <davem@iabyn.com>
Mon, 24 Jun 2019 10:40:06 +0000 (11:40 +0100)
commit2a56a87fe357165c2bf7fc0d0f54565fef60bb9a
tree3d0dfb6465d80adf3132f4741cfbe20a502b617f
parentec121dacb4d1d7f6aa78abbd19bf388858bf5095
scalarvoid(): remove anti-recursion deferring

Perl_scalarvoid() used to recursively work its way down an optree
marking ops as being in the appropriate context.

Around 5.22.0 the code was changed to avoid recursion, and instead to
malloc a buffer (if necessary) to maintain a list of deferred child ops
that need visiting. This stopped perl crashing if the optree (and thus
the recursion) was too deep, but it introduced a potential leak.
For example

    use warnings FATAL => qw(void);
    $a = "abc";
    length $a ;

The fatal warning causes scalarvoid() to leak the deferred buffer.

This commit removes the deferred mechanism, and instead makes use of the
newish OP_PARENT mechanism to iterate over the optree, following each
kid, then back up via the parent pointer to the next sibling etc.
op.c