From 12134e83d1a206c1305977bf3d986f2d91aa85a2 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 13 Nov 2010 11:08:50 -0600 Subject: don't leak old glob values --- Stash.xs | 10 ++++++++++ t/20-leaks.t | 1 - 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Stash.xs b/Stash.xs index 17b9c64..4161ac6 100644 --- a/Stash.xs +++ b/Stash.xs @@ -389,18 +389,28 @@ add_package_symbol(self, variable, initial=NULL, ...) switch (variable.type) { case VAR_SCALAR: + if (GvSV(glob)) + SvREFCNT_dec(GvSV(glob)); GvSV(glob) = val; break; case VAR_ARRAY: + if (GvAV(glob)) + SvREFCNT_dec((SV*)GvAV(glob)); GvAV(glob) = (AV*)val; break; case VAR_HASH: + if (GvHV(glob)) + SvREFCNT_dec((SV*)GvHV(glob)); GvHV(glob) = (HV*)val; break; case VAR_CODE: + if (GvCV(glob)) + SvREFCNT_dec((SV*)GvCV(glob)); GvCV(glob) = (CV*)val; break; case VAR_IO: + if (GvIO(glob)) + SvREFCNT_dec((SV*)GvIO(glob)); GvIOp(glob) = (IO*)val; break; } diff --git a/t/20-leaks.t b/t/20-leaks.t index bdfd37a..53989a6 100644 --- a/t/20-leaks.t +++ b/t/20-leaks.t @@ -62,7 +62,6 @@ use Symbol; $foo->add_package_symbol('$scalar_init' => 1); $foo->add_package_symbol('@array_init' => []); $foo->add_package_symbol('%hash_init' => {}); - # hmmm, wonder why this coderef isn't treated as a leak $foo->add_package_symbol('&code_init' => sub { "foo" }); $foo->add_package_symbol('io_init' => Symbol::geniosym); } "add_package_symbol doesn't leak"; -- cgit v1.2.3-54-g00ecf