add weak ref checking to Sub::Quote
Matt S Trout [Wed, 12 Jan 2011 16:19:39 +0000 (16:19 +0000)]
Changes
lib/Sub/Quote.pm

diff --git a/Changes b/Changes
index 627b689..d43d1d3 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,3 +1,4 @@
+  - weak ref checking for Sub::Quote to avoid bugs on refaddr reuse
   - Switch composed role names to be a valid package name
 
 0.9.5 Tue Jan 11 2011
index f8087e7..337815f 100644 (file)
@@ -6,6 +6,7 @@ sub _clean_eval { eval $_[0] }
 
 use Sub::Defer;
 use B 'perlstring';
+use Scalar::Util qw(weaken);
 use base qw(Exporter);
 
 our @EXPORT = qw(quote_sub unquote_sub quoted_from_sub);
@@ -14,6 +15,8 @@ our %QUOTE_OUTSTANDING;
 
 our %QUOTED;
 
+our %WEAK_REFS;
+
 sub capture_unroll {
   my ($from, $captures, $indent) = @_;
   join(
@@ -117,12 +120,13 @@ sub quote_sub {
   $QUOTE_OUTSTANDING{$outstanding} = $QUOTED{$outstanding} = [
     $name, $code, $captures
   ];
+  weaken($WEAK_REFS{$outstanding} = $deferred);
   return $deferred;
 }
 
 sub quoted_from_sub {
   my ($sub) = @_;
-  $QUOTED{$sub||''};
+  $WEAK_REFS{$sub||''} and $QUOTED{$sub||''};
 }
 
 sub unquote_sub {