Change the leaktracer to no longer rely on %Sub::Quote::QUOTED
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / _Util.pm
index f4bda73..d7b1ce2 100644 (file)
@@ -23,6 +23,9 @@ BEGIN {
 
     BROKEN_GOTO => ( "$]" < 5.008003 ) ? 1 : 0,
 
+    # perl -MScalar::Util=weaken -e 'weaken( $hash{key} = \"value" )'
+    BROKEN_WEAK_SCALARREF_VALUES => ( "$]" < 5.008003 ) ? 1 : 0,
+
     HAS_ITHREADS => $Config{useithreads} ? 1 : 0,
 
     UNSTABLE_DOLLARAT => ( "$]" < 5.013002 ) ? 1 : 0,
@@ -182,6 +185,7 @@ BEGIN {
   Sub::Quote->VERSION(2.002);
 }
 # Override forcing no_defer, and adding naming consistency checks
+our %refs_closed_over_by_quote_sub_installed_crefs;
 sub quote_sub {
   Carp::confess( "Anonymous quoting not supported by the DBIC sub_quote override - supply a sub name" ) if
     @_ < 2
@@ -214,6 +218,22 @@ sub quote_sub {
     no_defer => 1,
   };
 
+  weaken (
+    # just use a growing counter, no need to perform neither compaction
+    # nor any special ithread-level handling
+    $refs_closed_over_by_quote_sub_installed_crefs
+     { scalar keys %refs_closed_over_by_quote_sub_installed_crefs }
+      = $_
+  ) for grep {
+    length ref $_
+      and
+    (
+      ! DBIx::Class::_ENV_::BROKEN_WEAK_SCALARREF_VALUES
+        or
+      ref $_ ne 'SCALAR'
+    )
+  } values %{ $_[2] || {} };
+
   my $cref = Sub::Quote::quote_sub( $_[0], $_[1], $_[2]||{}, $sq_opts );
 
   # FIXME FIXME FIXME
@@ -727,17 +747,12 @@ sub modver_gt_or_eq_and_lt ($$$) {
       # efficiently operate over the query_cache directly
       describe_class_methods($_) for reverse @full_ISA;
 
-      my $current_node_refaddr;
       no strict 'refs';
 
       # combine full ISA-order inherited and local method list into a
       # "shadowing stack"
 
       (
-        $current_node_refaddr = refaddr($_)
-
-          and
-
         unshift @{ $slot->{methods}{$_->{name}} }, $_
 
           and