| Filename | /usr/share/perl5/DBIx/Class/_Util.pm |
| Statements | Executed 1148 statements in 4.14ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 1.57ms | 10.0ms | DBIx::Class::_Util::BEGIN@64 |
| 1 | 1 | 1 | 832µs | 936µs | DBIx::Class::_Util::BEGIN@56 |
| 89 | 1 | 1 | 570µs | 570µs | DBIx::Class::_Util::is_exception |
| 215 | 3 | 2 | 471µs | 471µs | DBIx::Class::_Util::perlstring |
| 1 | 1 | 1 | 74µs | 2.73ms | DBIx::Class::_ENV_::BEGIN@15 |
| 1 | 1 | 1 | 44µs | 65µs | DBIx::Class::_Util::BEGIN@60 |
| 1 | 1 | 1 | 16µs | 54µs | DBIx::Class::_Util::BEGIN@59 |
| 1 | 1 | 1 | 14µs | 33µs | DBIx::Class::_ENV_::BEGIN@13 |
| 1 | 1 | 1 | 14µs | 23µs | DBIx::Class::_Util::BEGIN@276 |
| 1 | 1 | 1 | 14µs | 83µs | DBIx::Class::_Util::BEGIN@79 |
| 1 | 1 | 1 | 14µs | 18µs | DBIx::Class::_Util::BEGIN@4 |
| 1 | 1 | 1 | 13µs | 31µs | DBIx::Class::_Util::BEGIN@9 |
| 1 | 1 | 1 | 12µs | 45µs | DBIx::Class::_Util::BEGIN@7 |
| 1 | 1 | 1 | 11µs | 45µs | DBIx::Class::_Util::BEGIN@88 |
| 1 | 1 | 1 | 10µs | 42µs | DBIx::Class::_Util::BEGIN@58 |
| 4 | 4 | 1 | 9µs | 9µs | DBIx::Class::_Util::qsub |
| 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 | 33µs | 2 | 22µs | # spent 18µs (14+4) within DBIx::Class::_Util::BEGIN@4 which was called:
# once (14µs+4µs) by DBIx::Class::BEGIN@18 at line 4 # spent 18µs making 1 call to DBIx::Class::_Util::BEGIN@4
# spent 4µs making 1 call to warnings::import |
| 5 | 2 | 54µs | 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 | 90µs | 2 | 79µs | # spent 45µs (12+34) within DBIx::Class::_Util::BEGIN@7 which was called:
# once (12µs+34µs) by DBIx::Class::BEGIN@18 at line 7 # spent 45µs making 1 call to DBIx::Class::_Util::BEGIN@7
# spent 34µs making 1 call to constant::import |
| 8 | |||||
| 9 | # spent 31µs (13+18) within DBIx::Class::_Util::BEGIN@9 which was called:
# once (13µs+18µs) by DBIx::Class::BEGIN@18 at line 52 | ||||
| 10 | package # hide from pause | ||||
| 11 | DBIx::Class::_ENV_; | ||||
| 12 | |||||
| 13 | 2 | 180µs | 2 | 52µs | # spent 33µs (14+19) within DBIx::Class::_ENV_::BEGIN@13 which was called:
# once (14µs+19µs) by DBIx::Class::BEGIN@18 at line 13 # spent 33µs making 1 call to DBIx::Class::_ENV_::BEGIN@13
# spent 19µs making 1 call to Config::import |
| 14 | |||||
| 15 | # spent 2.73ms (74µs+2.65) within DBIx::Class::_ENV_::BEGIN@15 which was called:
# once (74µs+2.65ms) 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 | 1 | 13µs | 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 | 2 | 209µs | 3 | 2.65ms | PEEPEENESS => ( eval { DBICTest::RunMode->is_smoker } && ($] >= 5.013005 and $] <= 5.013006) ), # spent 2.57ms making 2 calls to Config::FETCH, avg 1.28ms/call
# spent 82µ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 | 124µs | 1 | 2.73ms | }; # spent 2.73ms making 1 call to DBIx::Class::_ENV_::BEGIN@15 |
| 43 | |||||
| 44 | 1 | 4µs | if ($] < 5.009_005) { | ||
| 45 | require MRO::Compat; | ||||
| 46 | constant->import( OLD_MRO => 1 ); | ||||
| 47 | } | ||||
| 48 | else { | ||||
| 49 | 1 | 1µs | require mro; | ||
| 50 | 1 | 24µs | 1 | 18µs | constant->import( OLD_MRO => 0 ); # spent 18µs making 1 call to constant::import |
| 51 | } | ||||
| 52 | 1 | 39µs | 1 | 31µs | } # spent 31µ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 | 140µs | 2 | 973µs | # spent 936µs (832+104) within DBIx::Class::_Util::BEGIN@56 which was called:
# once (832µs+104µs) by DBIx::Class::BEGIN@18 at line 56 # spent 936µs making 1 call to DBIx::Class::_Util::BEGIN@56
# spent 37µs making 1 call to DBIx::Class::Carp::import |
| 57 | |||||
| 58 | 2 | 92µs | 2 | 73µs | # spent 42µs (10+31) within DBIx::Class::_Util::BEGIN@58 which was called:
# once (10µs+31µs) by DBIx::Class::BEGIN@18 at line 58 # spent 42µs making 1 call to DBIx::Class::_Util::BEGIN@58
# spent 31µs making 1 call to Exporter::import |
| 59 | 2 | 84µs | 2 | 92µs | # spent 54µs (16+38) within DBIx::Class::_Util::BEGIN@59 which was called:
# once (16µs+38µs) by DBIx::Class::BEGIN@18 at line 59 # spent 54µs making 1 call to DBIx::Class::_Util::BEGIN@59
# spent 38µs making 1 call to Exporter::import |
| 60 | 2 | 205µs | 2 | 86µs | # spent 65µs (44+21) within DBIx::Class::_Util::BEGIN@60 which was called:
# once (44µs+21µs) by DBIx::Class::BEGIN@18 at line 60 # spent 65µ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 10.0ms (1.57+8.45) within DBIx::Class::_Util::BEGIN@64 which was called:
# once (1.57ms+8.45ms) by DBIx::Class::BEGIN@18 at line 75 | ||||
| 65 | 1 | 4µs | my $initial_fatal_bits = (${^WARNING_BITS}||'') & $warnings::DeadBits{all}; | ||
| 66 | |||||
| 67 | 1 | 5µs | 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 | 1 | 111µs | require Sub::Quote; | ||
| 71 | 1 | 1µs | require Sub::Defer; | ||
| 72 | |||||
| 73 | 1 | 88µs | 1 | 78µs | Sub::Quote->import('quote_sub'); # spent 78µs making 1 call to Exporter::import |
| 74 | 1 | 16µs | ${^WARNING_BITS} &= ( $initial_fatal_bits | ~ $warnings::DeadBits{all} ); | ||
| 75 | 1 | 86µs | 1 | 10.0ms | } # spent 10.0ms making 1 call to DBIx::Class::_Util::BEGIN@64 |
| 76 | 4 | 19µs | 4 | 159µs | # spent 9µs within DBIx::Class::_Util::qsub which was called 4 times, avg 2µs/call:
# once (4µs+0s) by DBIx::Class::Storage::BEGIN@16 at line 57 of DBIx/Class/Storage/BlockRunner.pm
# once (3µ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 92 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 159µs making 4 calls to Sub::Quote::quote_sub, avg 40µs/call |
| 77 | # END pre-Moo2 import block | ||||
| 78 | |||||
| 79 | 2 | 133µs | 2 | 83µs | # spent 83µs (14+68) within DBIx::Class::_Util::BEGIN@79 which was called:
# once (14µs+68µs) by DBIx::Class::BEGIN@18 at line 79 # spent 83µs making 1 call to DBIx::Class::_Util::BEGIN@79
# spent 68µs making 1 call to base::import, recursion: max depth 2, sum of overlapping time 68µs |
| 80 | 1 | 2µs | 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 | 1.08ms | 2 | 79µs | # spent 45µs (11+34) within DBIx::Class::_Util::BEGIN@88 which was called:
# once (11µs+34µs) by DBIx::Class::BEGIN@18 at line 88 # spent 45µs making 1 call to DBIx::Class::_Util::BEGIN@88
# spent 34µ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 | 215 | 610µs | # spent 471µs within DBIx::Class::_Util::perlstring which was called 215 times, avg 2µs/call:
# 144 times (307µ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 (140µs+0s) by DBIx::Class::Relationship::Accessor::add_relationship_accessor at line 26 of DBIx/Class/Relationship/Accessor.pm, avg 3µs/call
# 18 times (24µ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 570µs within DBIx::Class::_Util::is_exception which was called 89 times, avg 6µs/call:
# 89 times (570µ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, avg 6µs/call | ||||
| 132 | 89 | 38µs | 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 | 89 | 30µs | return 0 unless defined $e; | ||
| 139 | |||||
| 140 | 89 | 29µs | my ($not_blank, $suberror); | ||
| 141 | { | ||||
| 142 | 178 | 49µs | local $@; | ||
| 143 | 89 | 70µs | eval { | ||
| 144 | 89 | 60µs | $not_blank = ($e ne '') ? 1 : 0; | ||
| 145 | 89 | 33µs | 1; | ||
| 146 | } or $suberror = $@; | ||||
| 147 | } | ||||
| 148 | |||||
| 149 | 89 | 31µs | 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 | 89 | 235µs | 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 | 2 | 900ns | 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 | 106µs | 2 | 32µs | # spent 23µs (14+9) within DBIx::Class::_Util::BEGIN@276 which was called:
# once (14µs+9µs) by DBIx::Class::BEGIN@18 at line 276 # spent 23µs making 1 call to DBIx::Class::_Util::BEGIN@276
# spent 9µs making 1 call to strict::unimport |
| 277 | B::Deparse->new->coderef2text(\&{$fr->[3]}) | ||||
| 278 | }), | ||||
| 279 | ), 'with_stacktrace'); | ||||
| 280 | } | ||||
| 281 | } | ||||
| 282 | |||||
| 283 | 1 | 4µs | 1; |