From: Jesse Luehrs Date: Fri, 4 Mar 2011 18:59:02 +0000 (-0600) Subject: disable caching of the namespace on 5.8 X-Git-Tag: 0.26~1 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=36cbfbad272906e832c887c1e07a22e21bd3b894;p=gitmo%2FPackage-Stash.git disable caching of the namespace on 5.8 --- diff --git a/lib/Package/Stash/PP.pm b/lib/Package/Stash/PP.pm index 653eeaf..60c486a 100644 --- a/lib/Package/Stash/PP.pm +++ b/lib/Package/Stash/PP.pm @@ -9,6 +9,9 @@ use Symbol; # before 5.12, assigning to the ISA glob would make it lose its magical ->isa # powers use constant BROKEN_ISA_ASSIGNMENT => ($] < 5.012); +# before 5.10, stashes don't ever seem to drop to a refcount of zero, so +# weakening them isn't helpful +use constant BROKEN_WEAK_STASH => ($] < 5.010); =head1 SYNOPSIS @@ -38,18 +41,23 @@ sub name { sub namespace { confess "Can't call namespace as a class method" unless blessed($_[0]); - return $_[0]->{namespace} if defined $_[0]->{namespace}; - { + if (BROKEN_WEAK_STASH) { no strict 'refs'; - # supposedly this caused a bug in earlier perls, but I can't reproduce - # it, so re-enabling the caching - $_[0]->{namespace} = \%{$_[0]->name . '::'}; + return \%{$_[0]->name . '::'}; } + else { + return $_[0]->{namespace} if defined $_[0]->{namespace}; - weaken($_[0]->{namespace}); + { + no strict 'refs'; + $_[0]->{namespace} = \%{$_[0]->name . '::'}; + } - return $_[0]->{namespace}; + weaken($_[0]->{namespace}); + + return $_[0]->{namespace}; + } } { diff --git a/t/02-extension.t b/t/02-extension.t index 2096221..f8e4752 100644 --- a/t/02-extension.t +++ b/t/02-extension.t @@ -21,6 +21,8 @@ use Test::Fatal; return $self; } + sub namespace { shift->{namespace} } + sub add_symbol { my ($self, $variable, $initial_value) = @_;