This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
stop map,grep leaking temps [perl #48004]
authorDavid Mitchell <davem@iabyn.com>
Mon, 4 Oct 2010 14:18:44 +0000 (15:18 +0100)
committerDavid Mitchell <davem@iabyn.com>
Mon, 4 Oct 2010 14:29:24 +0000 (15:29 +0100)
commitb2a2a9010bb3413ad9c32e455d93e01069d0fd73
tree868887e2cc166a735b2ee0b574b904f934ee06e1
parent07ffcb738e9467df21e3d33604cf09c125e7ff52
stop map,grep leaking temps [perl #48004]

The former behaviour of map and grep was to never free any temps.
Thus for large lists (and even worse, nested maps), the tmps stack could
grow very large. For all cases expect list-context map, the fix is easy:
just do a FREETMPS at the end of each iteration.

The list-context map however, needs to accumulate a list of temporaries
over the course of the iterations, and finally return that list to the
caller (which is responsible for freeing them). We get round this by, at
the end of each iteration, directly manipulating the tmps stack to free
everything *except* the values to be returned. To make this efficient,
we splice in the returned tmp items at the base of the stack frame, move
PL_tmps_floor above them, then do a FREETMPS (so they may appear twice on
the temps stack, but initially only get freed once).
pp_ctl.c
pp_hot.c
t/op/svleak.t