X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FCarp.pm;h=ecd0864325ae3f3b2eb1b10e52c43610d874f74b;hb=2d0b795a54a018d5c9cf2593cf83045962cd9b93;hp=5f40094eed6bd15c4d5c4f9987a810969e79e2c7;hpb=e0b2dc7456481be6870a23a5927a99c8416c82f7;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Carp.pm b/lib/DBIx/Class/Carp.pm index 5f40094..ecd0864 100644 --- a/lib/DBIx/Class/Carp.pm +++ b/lib/DBIx/Class/Carp.pm @@ -5,9 +5,9 @@ use warnings; # This is here instead of DBIx::Class because of load-order issues BEGIN { - ## FIXME FIXME FIXME - something is tripping up V::M on 5.8.1, leading - # to segfaults. When n::c/B::H::EndOfScope is rewritten in terms of tie() - # see if this starts working + # something is tripping up V::M on 5.8.1, leading to segfaults. + # A similar test in n::c itself is disabled on 5.8.1 for the same + # reason. There isn't much motivation to try to find why it happens *DBIx::Class::_ENV_::BROKEN_NAMESPACE_CLEAN = ($] < 5.008005) ? sub () { 1 } : sub () { 0 } @@ -30,6 +30,14 @@ sub __find_caller { my @f; while (@f = caller($fr_num++)) { last unless $f[0] =~ $skip_pattern; + + if ( + $f[0]->can('_skip_namespace_frames') + and + my $extra_skip = $f[0]->_skip_namespace_frames + ) { + $skip_pattern = qr/$skip_pattern|$extra_skip/; + } } my ($ln, $calling) = @f # if empty - nothing matched - full stack @@ -73,10 +81,10 @@ sub import { ); }; - my $fired; + my $fired = {}; *{"${into}::carp_once"} = sub { - return if $fired; - $fired = 1; + return if $fired->{$_[0]}; + $fired->{$_[0]} = 1; $warn->( __find_caller($skip_pattern, $into), @@ -133,7 +141,8 @@ In addition to the classic interface: this module also supports a class-data based way to specify the exclusion regex. A message is only carped from a callsite that matches neither the closed over string, nor the value of L as declared -on the B callframe origin. +on any callframe already skipped due to the same mechanism. This is to ensure +that intermediate callsites can declare their own additional skip-namespaces. =head1 CLASS ATTRIBUTES