Stop Constant(%s) errors from leaking
authorFather Chrysostomos <sprout@cpan.org>
Sat, 8 Dec 2012 13:44:44 +0000 (05:44 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 9 Dec 2012 02:46:53 +0000 (18:46 -0800)
commit5f7f7af517bf32a891a7a891c738ddbe40051b53
tree70c8468170ef679b4d8083c888dcb7c365120e40
parentbb4784f001b7eefaf06670e2ee209e9ea942d5af
Stop Constant(%s) errors from leaking

This error message uses yyerror, so it doesn’t abort immediately, but
adds it to the queue of error messages.

If there are ten accumulated errors, however, yyerror croaks with a
‘too many errors’ message.

In that circumstance these messages were leaking scalars.

Instead of creating an SV especially to hold the message to pass to
yyerror and then freeing it afterwards, we can instead use Perl_form,
which reuses the same SV every time (PL_mess_sv), eliminating that
leak.  In doing so, we can also combine this with another yyerror/
return in the vicinity, avoiding duplicate code.

The sv passed to S_new_constant was also leaking.  When there is no
error, it is currently mortalised.  When there is an error, it also
needs to be mortalised, in case it is a fatal error.  So this commit
changes it to mortalise it unconditionally.  This means we have to
SvREFCNT_inc the return value on error.
t/op/svleak.t
toke.c