Filename | /usr/share/perl5/DBIx/Class/_Util.pm |
Statements | Executed 298 statements in 4.67ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 2.91ms | 17.5ms | BEGIN@64 | DBIx::Class::_Util::
1 | 1 | 1 | 950µs | 1.07ms | BEGIN@56 | DBIx::Class::_Util::
215 | 3 | 2 | 422µs | 422µs | perlstring | DBIx::Class::_Util::
1 | 1 | 1 | 59µs | 2.76ms | BEGIN@15 | DBIx::Class::_ENV_::
1 | 1 | 1 | 46µs | 75µs | BEGIN@60 | DBIx::Class::_Util::
1 | 1 | 1 | 29µs | 50µs | BEGIN@276 | DBIx::Class::_Util::
4 | 1 | 1 | 25µs | 25µs | is_exception | DBIx::Class::_Util::
1 | 1 | 1 | 22µs | 138µs | BEGIN@79 | DBIx::Class::_Util::
1 | 1 | 1 | 18µs | 73µs | BEGIN@88 | DBIx::Class::_Util::
1 | 1 | 1 | 18µs | 38µs | BEGIN@9 | DBIx::Class::_Util::
1 | 1 | 1 | 16µs | 55µs | BEGIN@7 | DBIx::Class::_Util::
1 | 1 | 1 | 14µs | 50µs | BEGIN@58 | DBIx::Class::_Util::
1 | 1 | 1 | 13µs | 33µs | BEGIN@13 | DBIx::Class::_ENV_::
1 | 1 | 1 | 13µs | 18µs | BEGIN@4 | DBIx::Class::_Util::
1 | 1 | 1 | 11µs | 38µs | BEGIN@59 | DBIx::Class::_Util::
4 | 4 | 1 | 10µs | 10µs | qsub | DBIx::Class::_Util::
1 | 1 | 1 | 7µs | 13µs | BEGIN@5 | DBIx::Class::_Util::
0 | 0 | 0 | 0s | 0s | __ANON__[:95] | DBIx::Class::_Util::
0 | 0 | 0 | 0s | 0s | __ANON__[:97] | DBIx::Class::_Util::
0 | 0 | 0 | 0s | 0s | fail_on_internal_call | DBIx::Class::_Util::
0 | 0 | 0 | 0s | 0s | fail_on_internal_wantarray | DBIx::Class::_Util::
0 | 0 | 0 | 0s | 0s | hrefaddr | DBIx::Class::_Util::
0 | 0 | 0 | 0s | 0s | modver_gt_or_eq | DBIx::Class::_Util::
0 | 0 | 0 | 0s | 0s | refcount | DBIx::Class::_Util::
0 | 0 | 0 | 0s | 0s | refdesc | DBIx::Class::_Util::
0 | 0 | 0 | 0s | 0s | serialize | DBIx::Class::_Util::
0 | 0 | 0 | 0s | 0s | sigwarn_silencer | DBIx::Class::_Util::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package # hide from PAUSE | ||||
2 | DBIx::Class::_Util; | ||||
3 | |||||
4 | 2 | 35µs | 2 | 22µs | # spent 18µs (13+4) within DBIx::Class::_Util::BEGIN@4 which was called:
# once (13µ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 | 68µs | 2 | 19µs | # spent 13µs (7+6) within DBIx::Class::_Util::BEGIN@5 which was called:
# once (7µs+6µs) by DBIx::Class::BEGIN@18 at line 5 # spent 13µs making 1 call to DBIx::Class::_Util::BEGIN@5
# spent 6µs making 1 call to strict::import |
6 | |||||
7 | 2 | 103µs | 2 | 94µs | # spent 55µs (16+39) within DBIx::Class::_Util::BEGIN@7 which was called:
# once (16µs+39µs) by DBIx::Class::BEGIN@18 at line 7 # spent 55µs making 1 call to DBIx::Class::_Util::BEGIN@7
# spent 39µs making 1 call to constant::import |
8 | |||||
9 | # spent 38µs (18+21) within DBIx::Class::_Util::BEGIN@9 which was called:
# once (18µs+21µs) by DBIx::Class::BEGIN@18 at line 52 | ||||
10 | package # hide from pause | ||||
11 | DBIx::Class::_ENV_; | ||||
12 | |||||
13 | 2 | 172µs | 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 2.76ms (59µs+2.71) within DBIx::Class::_ENV_::BEGIN@15 which was called:
# once (59µs+2.71ms) 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 | 10µ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 | 126µs | 3 | 2.71ms | PEEPEENESS => ( eval { DBICTest::RunMode->is_smoker } && ($] >= 5.013005 and $] <= 5.013006) ), # spent 2.62ms making 2 calls to Config::FETCH, avg 1.31ms/call
# spent 84µ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 | 173µs | 1 | 2.76ms | }; # spent 2.76ms making 1 call to DBIx::Class::_ENV_::BEGIN@15 |
43 | |||||
44 | 1 | 5µ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 | 30µs | 1 | 21µs | constant->import( OLD_MRO => 0 ); # spent 21µs making 1 call to constant::import |
51 | } | ||||
52 | 1 | 41µs | 1 | 38µs | } # spent 38µ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 | 176µs | 2 | 1.11ms | # spent 1.07ms (950µs+119µs) within DBIx::Class::_Util::BEGIN@56 which was called:
# once (950µs+119µs) by DBIx::Class::BEGIN@18 at line 56 # spent 1.07ms making 1 call to DBIx::Class::_Util::BEGIN@56
# spent 44µs making 1 call to DBIx::Class::Carp::import |
57 | |||||
58 | 2 | 74µs | 2 | 85µs | # spent 50µs (14+35) within DBIx::Class::_Util::BEGIN@58 which was called:
# once (14µs+35µs) by DBIx::Class::BEGIN@18 at line 58 # spent 50µs making 1 call to DBIx::Class::_Util::BEGIN@58
# spent 35µs making 1 call to Exporter::import |
59 | 2 | 59µs | 2 | 66µs | # spent 38µs (11+28) within DBIx::Class::_Util::BEGIN@59 which was called:
# once (11µs+28µs) by DBIx::Class::BEGIN@18 at line 59 # spent 38µs making 1 call to DBIx::Class::_Util::BEGIN@59
# spent 28µs making 1 call to Exporter::import |
60 | 2 | 232µs | 2 | 103µs | # spent 75µs (46+29) within DBIx::Class::_Util::BEGIN@60 which was called:
# once (46µs+29µs) by DBIx::Class::BEGIN@18 at line 60 # spent 75µs making 1 call to DBIx::Class::_Util::BEGIN@60
# spent 29µ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 17.5ms (2.91+14.6) within DBIx::Class::_Util::BEGIN@64 which was called:
# once (2.91ms+14.6ms) by DBIx::Class::BEGIN@18 at line 75 | ||||
65 | 1 | 9µs | my $initial_fatal_bits = (${^WARNING_BITS}||'') & $warnings::DeadBits{all}; | ||
66 | |||||
67 | 1 | 9µ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 | 200µs | require Sub::Quote; | ||
71 | 1 | 2µs | require Sub::Defer; | ||
72 | |||||
73 | 1 | 95µs | 1 | 74µs | Sub::Quote->import('quote_sub'); # spent 74µs making 1 call to Exporter::import |
74 | 1 | 29µs | ${^WARNING_BITS} &= ( $initial_fatal_bits | ~ $warnings::DeadBits{all} ); | ||
75 | 1 | 148µs | 1 | 17.5ms | } # spent 17.5ms making 1 call to DBIx::Class::_Util::BEGIN@64 |
76 | 4 | 17µs | 4 | 157µs | # spent 10µs within DBIx::Class::_Util::qsub which was called 4 times, avg 2µs/call:
# once (3µ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 92 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 (2µs+0s) by DBIx::Class::Storage::BEGIN@16 at line 66 of DBIx/Class/Storage/BlockRunner.pm # spent 157µs making 4 calls to Sub::Quote::quote_sub, avg 39µs/call |
77 | # END pre-Moo2 import block | ||||
78 | |||||
79 | 2 | 229µs | 2 | 138µs | # spent 138µs (22+115) within DBIx::Class::_Util::BEGIN@79 which was called:
# once (22µs+115µs) by DBIx::Class::BEGIN@18 at line 79 # spent 138µs making 1 call to DBIx::Class::_Util::BEGIN@79
# spent 115µs making 1 call to base::import, recursion: max depth 2, sum of overlapping time 115µs |
80 | 1 | 6µ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.79ms | 2 | 128µs | # spent 73µs (18+55) within DBIx::Class::_Util::BEGIN@88 which was called:
# once (18µs+55µs) by DBIx::Class::BEGIN@18 at line 88 # spent 73µs making 1 call to DBIx::Class::_Util::BEGIN@88
# spent 55µ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 422µs within DBIx::Class::_Util::perlstring which was called 215 times, avg 2µs/call:
# 144 times (281µ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 (118µ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 (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 25µs within DBIx::Class::_Util::is_exception which was called 4 times, avg 6µs/call:
# 4 times (25µ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 | 4 | 2µ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 | 4 | 800ns | return 0 unless defined $e; | ||
139 | |||||
140 | 4 | 1µs | my ($not_blank, $suberror); | ||
141 | { | ||||
142 | 8 | 3µs | local $@; | ||
143 | 4 | 3µs | eval { | ||
144 | 4 | 2µs | $not_blank = ($e ne '') ? 1 : 0; | ||
145 | 4 | 1µs | 1; | ||
146 | } or $suberror = $@; | ||||
147 | } | ||||
148 | |||||
149 | 4 | 1µ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 | 4 | 13µ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 | 1µs | 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 | 187µs | 2 | 71µs | # spent 50µs (29+21) within DBIx::Class::_Util::BEGIN@276 which was called:
# once (29µs+21µs) by DBIx::Class::BEGIN@18 at line 276 # spent 50µs making 1 call to DBIx::Class::_Util::BEGIN@276
# spent 21µs making 1 call to strict::unimport |
277 | B::Deparse->new->coderef2text(\&{$fr->[3]}) | ||||
278 | }), | ||||
279 | ), 'with_stacktrace'); | ||||
280 | } | ||||
281 | } | ||||
282 | |||||
283 | 1 | 6µs | 1; |