| Filename | /usr/share/perl5/DBIx/Class/_Util.pm | 
| Statements | Executed 0 statements in 0s | 
| Calls | P | F | Exclusive Time  | 
        Inclusive Time  | 
        Subroutine | 
|---|---|---|---|---|---|
| 1 | 1 | 1 | 1.62ms | 9.84ms | DBIx::Class::_Util::BEGIN@64 | 
| 1 | 1 | 1 | 830µs | 935µs | DBIx::Class::_Util::BEGIN@56 | 
| 215 | 3 | 2 | 447µs | 447µs | DBIx::Class::_Util::perlstring | 
| 1 | 1 | 1 | 54µs | 3.51ms | DBIx::Class::_ENV_::BEGIN@15 | 
| 1 | 1 | 1 | 36µs | 58µs | DBIx::Class::_Util::BEGIN@60 | 
| 1 | 1 | 1 | 21µs | 90µs | DBIx::Class::_Util::BEGIN@79 | 
| 1 | 1 | 1 | 14µs | 18µs | DBIx::Class::_Util::BEGIN@4 | 
| 1 | 1 | 1 | 13µs | 33µs | DBIx::Class::_ENV_::BEGIN@13 | 
| 1 | 1 | 1 | 12µs | 46µs | DBIx::Class::_Util::BEGIN@7 | 
| 1 | 1 | 1 | 12µs | 29µs | DBIx::Class::_Util::BEGIN@9 | 
| 1 | 1 | 1 | 11µs | 19µs | DBIx::Class::_Util::BEGIN@276 | 
| 1 | 1 | 1 | 10µs | 53µs | DBIx::Class::_Util::BEGIN@88 | 
| 4 | 4 | 1 | 10µs | 10µs | DBIx::Class::_Util::qsub | 
| 1 | 1 | 1 | 10µs | 41µs | DBIx::Class::_Util::BEGIN@58 | 
| 1 | 1 | 1 | 10µs | 10µs | DBIx::Class::_Util::is_exception | 
| 1 | 1 | 1 | 10µs | 35µs | DBIx::Class::_Util::BEGIN@59 | 
| 1 | 1 | 1 | 8µs | 14µs | DBIx::Class::_Util::BEGIN@5 | 
| 0 | 0 | 0 | 0s | 0s | DBIx::Class::_Util::__ANON__[:95] | 
| 0 | 0 | 0 | 0s | 0s | DBIx::Class::_Util::__ANON__[:97] | 
| 0 | 0 | 0 | 0s | 0s | DBIx::Class::_Util::fail_on_internal_call | 
| 0 | 0 | 0 | 0s | 0s | DBIx::Class::_Util::fail_on_internal_wantarray | 
| 0 | 0 | 0 | 0s | 0s | DBIx::Class::_Util::hrefaddr | 
| 0 | 0 | 0 | 0s | 0s | DBIx::Class::_Util::modver_gt_or_eq | 
| 0 | 0 | 0 | 0s | 0s | DBIx::Class::_Util::refcount | 
| 0 | 0 | 0 | 0s | 0s | DBIx::Class::_Util::refdesc | 
| 0 | 0 | 0 | 0s | 0s | DBIx::Class::_Util::serialize | 
| 0 | 0 | 0 | 0s | 0s | DBIx::Class::_Util::sigwarn_silencer | 
| Line | State ments  | 
      Time on line  | 
      Calls | Time in subs  | 
      Code | 
|---|---|---|---|---|---|
| 1 | package # hide from PAUSE | ||||
| 2 | DBIx::Class::_Util; | ||||
| 3 | |||||
| 4 | 2 | 23µs | # spent 18µs (14+5) within DBIx::Class::_Util::BEGIN@4 which was called:
#    once (14µs+5µs) by DBIx::Class::BEGIN@18 at line 4 # spent    18µs making 1 call to DBIx::Class::_Util::BEGIN@4
# spent     5µs making 1 call to warnings::import  | ||
| 5 | 2 | 20µs | # spent 14µs (8+6) within DBIx::Class::_Util::BEGIN@5 which was called:
#    once (8µs+6µs) by DBIx::Class::BEGIN@18 at line 5 # spent    14µs making 1 call to DBIx::Class::_Util::BEGIN@5
# spent     6µs making 1 call to strict::import  | ||
| 6 | |||||
| 7 | 2 | 79µs | # spent 46µs (12+33) within DBIx::Class::_Util::BEGIN@7 which was called:
#    once (12µs+33µs) by DBIx::Class::BEGIN@18 at line 7 # spent    46µs making 1 call to DBIx::Class::_Util::BEGIN@7
# spent    33µs making 1 call to constant::import  | ||
| 8 | |||||
| 9 | # spent 29µs (12+18) within DBIx::Class::_Util::BEGIN@9 which was called:
#    once (12µs+18µs) by DBIx::Class::BEGIN@18 at line 52  | ||||
| 10 | package # hide from pause | ||||
| 11 | DBIx::Class::_ENV_; | ||||
| 12 | |||||
| 13 | 2 | 53µs | # spent 33µs (13+20) within DBIx::Class::_ENV_::BEGIN@13 which was called:
#    once (13µs+20µs) by DBIx::Class::BEGIN@18 at line 13   # spent    33µs making 1 call to DBIx::Class::_ENV_::BEGIN@13
  # spent    20µs making 1 call to Config::import  | ||
| 14 | |||||
| 15 | # spent 3.51ms (54µs+3.46) within DBIx::Class::_ENV_::BEGIN@15 which was called:
#    once (54µs+3.46ms) by DBIx::Class::BEGIN@18 at line 42  | ||||
| 16 | |||||
| 17 | # but of course | ||||
| 18 | BROKEN_FORK => ($^O eq 'MSWin32') ? 1 : 0, | ||||
| 19 | |||||
| 20 | BROKEN_GOTO => ($] < '5.008003') ? 1 : 0, | ||||
| 21 | |||||
| 22 | HAS_ITHREADS => $Config{useithreads} ? 1 : 0, | ||||
| 23 | |||||
| 24 | # ::Runmode would only be loaded by DBICTest, which in turn implies t/ | ||||
| 25 | DBICTEST => eval { DBICTest::RunMode->is_author } ? 1 : 0, | ||||
| 26 | |||||
| 27 | # During 5.13 dev cycle HELEMs started to leak on copy | ||||
| 28 | # add an escape for these perls ON SMOKERS - a user will still get death | ||||
| 29 | 3 | 3.46ms |     PEEPEENESS => ( eval { DBICTest::RunMode->is_smoker } && ($] >= 5.013005 and $] <= 5.013006) ),     # spent  3.38ms making 2 calls to Config::FETCH, avg 1.69ms/call
    # spent    75µs making 1 call to constant::import  | ||
| 30 | |||||
| 31 | SHUFFLE_UNORDERED_RESULTSETS => $ENV{DBIC_SHUFFLE_UNORDERED_RESULTSETS} ? 1 : 0, | ||||
| 32 | |||||
| 33 | ASSERT_NO_INTERNAL_WANTARRAY => $ENV{DBIC_ASSERT_NO_INTERNAL_WANTARRAY} ? 1 : 0, | ||||
| 34 | |||||
| 35 | ASSERT_NO_INTERNAL_INDIRECT_CALLS => $ENV{DBIC_ASSERT_NO_INTERNAL_INDIRECT_CALLS} ? 1 : 0, | ||||
| 36 | |||||
| 37 | STRESSTEST_UTF8_UPGRADE_GENERATED_COLLAPSER_SOURCE => $ENV{DBIC_STRESSTEST_UTF8_UPGRADE_GENERATED_COLLAPSER_SOURCE} ? 1 : 0, | ||||
| 38 | |||||
| 39 | IV_SIZE => $Config{ivsize}, | ||||
| 40 | |||||
| 41 | OS_NAME => $^O, | ||||
| 42 | 1 | 3.51ms |   };   # spent  3.51ms making 1 call to DBIx::Class::_ENV_::BEGIN@15  | ||
| 43 | |||||
| 44 | if ($] < 5.009_005) { | ||||
| 45 | require MRO::Compat; | ||||
| 46 | constant->import( OLD_MRO => 1 ); | ||||
| 47 | } | ||||
| 48 | else { | ||||
| 49 | require mro; | ||||
| 50 | 1 | 18µs |     constant->import( OLD_MRO => 0 );     # spent    18µs making 1 call to constant::import  | ||
| 51 | } | ||||
| 52 | 1 | 29µs | } # spent    29µs making 1 call to DBIx::Class::_Util::BEGIN@9  | ||
| 53 | |||||
| 54 | # FIXME - this is not supposed to be here | ||||
| 55 | # Carp::Skip to the rescue soon | ||||
| 56 | 2 | 977µs | # spent 935µs (830+105) within DBIx::Class::_Util::BEGIN@56 which was called:
#    once (830µs+105µs) by DBIx::Class::BEGIN@18 at line 56 # spent   935µs making 1 call to DBIx::Class::_Util::BEGIN@56
# spent    41µs making 1 call to DBIx::Class::Carp::import  | ||
| 57 | |||||
| 58 | 2 | 71µs | # spent 41µs (10+30) within DBIx::Class::_Util::BEGIN@58 which was called:
#    once (10µs+30µs) by DBIx::Class::BEGIN@18 at line 58 # spent    41µs making 1 call to DBIx::Class::_Util::BEGIN@58
# spent    30µs making 1 call to Exporter::import  | ||
| 59 | 2 | 61µs | # spent 35µs (10+26) within DBIx::Class::_Util::BEGIN@59 which was called:
#    once (10µs+26µs) by DBIx::Class::BEGIN@18 at line 59 # spent    35µs making 1 call to DBIx::Class::_Util::BEGIN@59
# spent    26µs making 1 call to Exporter::import  | ||
| 60 | 2 | 79µs | # spent 58µs (36+21) within DBIx::Class::_Util::BEGIN@60 which was called:
#    once (36µs+21µs) by DBIx::Class::BEGIN@18 at line 60 # spent    58µs making 1 call to DBIx::Class::_Util::BEGIN@60
# spent    21µs making 1 call to List::Util::import  | ||
| 61 | |||||
| 62 | # DO NOT edit away without talking to riba first, he will just put it back | ||||
| 63 | # BEGIN pre-Moo2 import block | ||||
| 64 | # spent 9.84ms (1.62+8.22) within DBIx::Class::_Util::BEGIN@64 which was called:
#    once (1.62ms+8.22ms) by DBIx::Class::BEGIN@18 at line 75  | ||||
| 65 | my $initial_fatal_bits = (${^WARNING_BITS}||'') & $warnings::DeadBits{all}; | ||||
| 66 | |||||
| 67 | local $ENV{PERL_STRICTURES_EXTRA} = 0; | ||||
| 68 | # load all of these now, so that lazy-loading does not escape | ||||
| 69 | # the current PERL_STRICTURES_EXTRA setting | ||||
| 70 | require Sub::Quote; | ||||
| 71 | require Sub::Defer; | ||||
| 72 | |||||
| 73 | 1 | 38µs |   Sub::Quote->import('quote_sub');   # spent    38µs making 1 call to Exporter::import  | ||
| 74 | ${^WARNING_BITS} &= ( $initial_fatal_bits | ~ $warnings::DeadBits{all} ); | ||||
| 75 | 1 | 9.84ms | } # spent  9.84ms making 1 call to DBIx::Class::_Util::BEGIN@64  | ||
| 76 | 4 | 182µs | # spent 10µs within DBIx::Class::_Util::qsub which was called 4 times, avg 3µs/call:
#    once (4µs+0s) by DBIx::Class::Storage::BEGIN@16 at line 92 of DBIx/Class/Storage/BlockRunner.pm
#    once (3µs+0s) by DBIx::Class::Storage::BEGIN@16 at line 57 of DBIx/Class/Storage/BlockRunner.pm
#    once (2µs+0s) by DBIx::Class::Storage::BEGIN@16 at line 78 of DBIx/Class/Storage/BlockRunner.pm
#    once (1µs+0s) by DBIx::Class::Storage::BEGIN@16 at line 66 of DBIx/Class/Storage/BlockRunner.pm # spent   182µs making 4 calls to Sub::Quote::quote_sub, avg 45µs/call  | ||
| 77 | # END pre-Moo2 import block | ||||
| 78 | |||||
| 79 | 2 | 90µs | # spent 90µs (21+69) within DBIx::Class::_Util::BEGIN@79 which was called:
#    once (21µs+69µs) by DBIx::Class::BEGIN@18 at line 79 # spent    90µs making 1 call to DBIx::Class::_Util::BEGIN@79
# spent    69µs making 1 call to base::import, recursion: max depth 2, sum of overlapping time 69µs  | ||
| 80 | our @EXPORT_OK = qw( | ||||
| 81 | sigwarn_silencer modver_gt_or_eq | ||||
| 82 | fail_on_internal_wantarray fail_on_internal_call | ||||
| 83 | refdesc refcount hrefaddr is_exception | ||||
| 84 | quote_sub qsub perlstring serialize | ||||
| 85 | UNRESOLVABLE_CONDITION | ||||
| 86 | ); | ||||
| 87 | |||||
| 88 | 2 | 95µs | # spent 53µs (10+42) within DBIx::Class::_Util::BEGIN@88 which was called:
#    once (10µs+42µs) by DBIx::Class::BEGIN@18 at line 88 # spent    53µs making 1 call to DBIx::Class::_Util::BEGIN@88
# spent    42µs making 1 call to constant::import  | ||
| 89 | |||||
| 90 | sub sigwarn_silencer ($) { | ||||
| 91 | my $pattern = shift; | ||||
| 92 | |||||
| 93 | croak "Expecting a regexp" if ref $pattern ne 'Regexp'; | ||||
| 94 | |||||
| 95 | my $orig_sig_warn = $SIG{__WARN__} || sub { CORE::warn(@_) }; | ||||
| 96 | |||||
| 97 | return sub { &$orig_sig_warn unless $_[0] =~ $pattern }; | ||||
| 98 | } | ||||
| 99 | |||||
| 100 | # spent 447µs within DBIx::Class::_Util::perlstring which was called 215 times, avg 2µs/call:
# 144 times (288µs+0s) by DBIx::Class::Relationship::Accessor::add_relationship_accessor at line 101 of DBIx/Class/Relationship/Accessor.pm, avg 2µs/call
#  53 times (132µs+0s) by DBIx::Class::Relationship::Accessor::add_relationship_accessor at line 26 of DBIx/Class/Relationship/Accessor.pm, avg 2µs/call
#  18 times (27µs+0s) by Class::C3::Componentised::ensure_class_loaded at line 124 of DBIx/Class/Storage/DBI.pm, avg 1µs/call  | ||||
| 101 | |||||
| 102 | sub hrefaddr ($) { sprintf '0x%x', &Scalar::Util::refaddr||0 } | ||||
| 103 | |||||
| 104 | sub refdesc ($) { | ||||
| 105 | croak "Expecting a reference" if ! length ref $_[0]; | ||||
| 106 | |||||
| 107 | # be careful not to trigger stringification, | ||||
| 108 | # reuse @_ as a scratch-pad | ||||
| 109 | sprintf '%s%s(0x%x)', | ||||
| 110 | ( defined( $_[1] = blessed $_[0]) ? "$_[1]=" : '' ), | ||||
| 111 | reftype $_[0], | ||||
| 112 | Scalar::Util::refaddr($_[0]), | ||||
| 113 | ; | ||||
| 114 | } | ||||
| 115 | |||||
| 116 | sub refcount ($) { | ||||
| 117 | croak "Expecting a reference" if ! length ref $_[0]; | ||||
| 118 | |||||
| 119 | require B; | ||||
| 120 | # No tempvars - must operate on $_[0], otherwise the pad | ||||
| 121 | # will count as an extra ref | ||||
| 122 | B::svref_2object($_[0])->REFCNT; | ||||
| 123 | } | ||||
| 124 | |||||
| 125 | sub serialize ($) { | ||||
| 126 | require Storable; | ||||
| 127 | local $Storable::canonical = 1; | ||||
| 128 | Storable::nfreeze($_[0]); | ||||
| 129 | } | ||||
| 130 | |||||
| 131 | # spent 10µs within DBIx::Class::_Util::is_exception which was called:
#    once (10µs+0s) by DBIx::Class::Storage::BlockRunner::__ANON__[/usr/share/perl5/DBIx/Class/Storage/BlockRunner.pm:233] at line 179 of DBIx/Class/Storage/BlockRunner.pm  | ||||
| 132 | my $e = $_[0]; | ||||
| 133 | |||||
| 134 | # this is not strictly correct - an eval setting $@ to undef | ||||
| 135 | # is *not* the same as an eval setting $@ to '' | ||||
| 136 | # but for the sake of simplicity assume the following for | ||||
| 137 | # the time being | ||||
| 138 | return 0 unless defined $e; | ||||
| 139 | |||||
| 140 | my ($not_blank, $suberror); | ||||
| 141 | { | ||||
| 142 | local $@; | ||||
| 143 | eval { | ||||
| 144 | $not_blank = ($e ne '') ? 1 : 0; | ||||
| 145 | 1; | ||||
| 146 | } or $suberror = $@; | ||||
| 147 | } | ||||
| 148 | |||||
| 149 | if (defined $suberror) { | ||||
| 150 | if (length (my $class = blessed($e) )) { | ||||
| 151 | carp_unique( sprintf( | ||||
| 152 | 'External exception class %s implements partial (broken) overloading ' | ||||
| 153 | . 'preventing its instances from being used in simple ($x eq $y) ' | ||||
| 154 | . 'comparisons. Given Perl\'s "globally cooperative" exception ' | ||||
| 155 | . 'handling this type of brokenness is extremely dangerous on ' | ||||
| 156 | . 'exception objects, as it may (and often does) result in silent ' | ||||
| 157 | . '"exception substitution". DBIx::Class tries to work around this ' | ||||
| 158 | . 'as much as possible, but other parts of your software stack may ' | ||||
| 159 | . 'not be even aware of this. Please submit a bugreport against the ' | ||||
| 160 | . 'distribution containing %s and in the meantime apply a fix similar ' | ||||
| 161 | . 'to the one shown at %s, in order to ensure your exception handling ' | ||||
| 162 | . 'is saner application-wide. What follows is the actual error text ' | ||||
| 163 | . "as generated by Perl itself:\n\n%s\n ", | ||||
| 164 | $class, | ||||
| 165 | $class, | ||||
| 166 | 'http://v.gd/DBIC_overload_tempfix/', | ||||
| 167 | $suberror, | ||||
| 168 | )); | ||||
| 169 | |||||
| 170 | # workaround, keeps spice flowing | ||||
| 171 | $not_blank = ("$e" ne '') ? 1 : 0; | ||||
| 172 | } | ||||
| 173 | else { | ||||
| 174 | # not blessed yet failed the 'ne'... this makes 0 sense... | ||||
| 175 | # just throw further | ||||
| 176 | die $suberror | ||||
| 177 | } | ||||
| 178 | } | ||||
| 179 | |||||
| 180 | return $not_blank; | ||||
| 181 | } | ||||
| 182 | |||||
| 183 | sub modver_gt_or_eq ($$) { | ||||
| 184 | my ($mod, $ver) = @_; | ||||
| 185 | |||||
| 186 | croak "Nonsensical module name supplied" | ||||
| 187 | if ! defined $mod or ! length $mod; | ||||
| 188 | |||||
| 189 | croak "Nonsensical minimum version supplied" | ||||
| 190 | if ! defined $ver or $ver =~ /[^0-9\.\_]/; | ||||
| 191 | |||||
| 192 | local $SIG{__WARN__} = sigwarn_silencer( qr/\Qisn't numeric in subroutine entry/ ) | ||||
| 193 | if SPURIOUS_VERSION_CHECK_WARNINGS; | ||||
| 194 | |||||
| 195 | croak "$mod does not seem to provide a version (perhaps it never loaded)" | ||||
| 196 | unless $mod->VERSION; | ||||
| 197 | |||||
| 198 | local $@; | ||||
| 199 | eval { $mod->VERSION($ver) } ? 1 : 0; | ||||
| 200 | } | ||||
| 201 | |||||
| 202 | { | ||||
| 203 | my $list_ctx_ok_stack_marker; | ||||
| 204 | |||||
| 205 | sub fail_on_internal_wantarray () { | ||||
| 206 | return if $list_ctx_ok_stack_marker; | ||||
| 207 | |||||
| 208 | if (! defined wantarray) { | ||||
| 209 | croak('fail_on_internal_wantarray() needs a tempvar to save the stack marker guard'); | ||||
| 210 | } | ||||
| 211 | |||||
| 212 | my $cf = 1; | ||||
| 213 | while ( ( (caller($cf+1))[3] || '' ) =~ / :: (?: | ||||
| 214 | |||||
| 215 | # these are public API parts that alter behavior on wantarray | ||||
| 216 | search | search_related | slice | search_literal | ||||
| 217 | |||||
| 218 | | | ||||
| 219 | |||||
| 220 | # these are explicitly prefixed, since we only recognize them as valid | ||||
| 221 | # escapes when they come from the guts of CDBICompat | ||||
| 222 | CDBICompat .*? :: (?: search_where | retrieve_from_sql | retrieve_all ) | ||||
| 223 | |||||
| 224 | ) $/x ) { | ||||
| 225 | $cf++; | ||||
| 226 | } | ||||
| 227 | |||||
| 228 | my ($fr, $want, $argdesc); | ||||
| 229 | { | ||||
| 230 | package DB; | ||||
| 231 | |||||
| - - | |||||
| 239 | if ( | ||||
| 240 | $want and $fr->[0] =~ /^(?:DBIx::Class|DBICx::)/ | ||||
| 241 | ) { | ||||
| 242 | DBIx::Class::Exception->throw( sprintf ( | ||||
| 243 | "Improper use of %s instance in list context at %s line %d\n\n Stacktrace starts", | ||||
| 244 | $argdesc, @{$fr}[1,2] | ||||
| 245 | ), 'with_stacktrace'); | ||||
| 246 | } | ||||
| 247 | |||||
| 248 | my $mark = []; | ||||
| 249 | weaken ( $list_ctx_ok_stack_marker = $mark ); | ||||
| 250 | $mark; | ||||
| 251 | } | ||||
| 252 | } | ||||
| 253 | |||||
| 254 | sub fail_on_internal_call { | ||||
| 255 | my ($fr, $argdesc); | ||||
| 256 | { | ||||
| 257 | package DB; | ||||
| 258 | |||||
| - - | |||||
| 265 | if ( | ||||
| 266 | $argdesc | ||||
| 267 | and | ||||
| 268 | $fr->[0] =~ /^(?:DBIx::Class|DBICx::)/ | ||||
| 269 | and | ||||
| 270 | $fr->[1] !~ /\b(?:CDBICompat|ResultSetProxy)\b/ # no point touching there | ||||
| 271 | ) { | ||||
| 272 | DBIx::Class::Exception->throw( sprintf ( | ||||
| 273 | "Illegal internal call of indirect proxy-method %s() with argument %s: examine the last lines of the proxy method deparse below to determine what to call directly instead at %s on line %d\n\n%s\n\n Stacktrace starts", | ||||
| 274 | $fr->[3], $argdesc, @{$fr}[1,2], ( $fr->[6] || do { | ||||
| 275 | require B::Deparse; | ||||
| 276 | 2 | 26µs | # spent 19µs (11+8) within DBIx::Class::_Util::BEGIN@276 which was called:
#    once (11µs+8µs) by DBIx::Class::BEGIN@18 at line 276         # spent    19µs making 1 call to DBIx::Class::_Util::BEGIN@276
        # spent     8µs making 1 call to strict::unimport  | ||
| 277 | B::Deparse->new->coderef2text(\&{$fr->[3]}) | ||||
| 278 | }), | ||||
| 279 | ), 'with_stacktrace'); | ||||
| 280 | } | ||||
| 281 | } | ||||
| 282 | |||||
| 283 | 1; |