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 | BEGIN@64 | DBIx::Class::_Util::
1 | 1 | 1 | 830µs | 935µs | BEGIN@56 | DBIx::Class::_Util::
215 | 3 | 2 | 447µs | 447µs | perlstring | DBIx::Class::_Util::
1 | 1 | 1 | 54µs | 3.51ms | BEGIN@15 | DBIx::Class::_ENV_::
1 | 1 | 1 | 36µs | 58µs | BEGIN@60 | DBIx::Class::_Util::
1 | 1 | 1 | 21µs | 90µs | BEGIN@79 | DBIx::Class::_Util::
1 | 1 | 1 | 14µs | 18µs | BEGIN@4 | DBIx::Class::_Util::
1 | 1 | 1 | 13µs | 33µs | BEGIN@13 | DBIx::Class::_ENV_::
1 | 1 | 1 | 12µs | 46µs | BEGIN@7 | DBIx::Class::_Util::
1 | 1 | 1 | 12µs | 29µs | BEGIN@9 | DBIx::Class::_Util::
1 | 1 | 1 | 11µs | 19µs | BEGIN@276 | DBIx::Class::_Util::
1 | 1 | 1 | 10µs | 53µs | BEGIN@88 | DBIx::Class::_Util::
4 | 4 | 1 | 10µs | 10µs | qsub | DBIx::Class::_Util::
1 | 1 | 1 | 10µs | 41µs | BEGIN@58 | DBIx::Class::_Util::
1 | 1 | 1 | 10µs | 10µs | is_exception | DBIx::Class::_Util::
1 | 1 | 1 | 10µs | 35µs | BEGIN@59 | DBIx::Class::_Util::
1 | 1 | 1 | 8µs | 14µ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 | 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; |