diff options
author | Jesse Luehrs <doy@tozt.net> | 2010-11-13 11:08:50 -0600 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2010-11-13 11:09:17 -0600 |
commit | 12134e83d1a206c1305977bf3d986f2d91aa85a2 (patch) | |
tree | e707dc9aeaf54db5ed5730361c5dc2ae00153df3 | |
parent | 5bb2b07b62d7680eef3db9510d7fde1df09747a1 (diff) | |
download | package-stash-xs-12134e83d1a206c1305977bf3d986f2d91aa85a2.tar.gz package-stash-xs-12134e83d1a206c1305977bf3d986f2d91aa85a2.zip |
don't leak old glob values
-rw-r--r-- | Stash.xs | 10 | ||||
-rw-r--r-- | t/20-leaks.t | 1 |
2 files changed, 10 insertions, 1 deletions
@@ -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"; |