← Index
NYTProf Performance Profile   « line view »
For bin/benchmark-perlformance
  Run on Fri Apr 17 15:31:48 2015
Reported on Fri Apr 17 15:32:02 2015

Filename/home/ss5/perl5/perlbrew/perls/tapper-perl/lib/site_perl/5.16.3/Devel/StackTrace.pm
StatementsExecuted 1484 statements in 3.70ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
8111.70ms2.83msDevel::StackTrace::::_record_caller_dataDevel::StackTrace::_record_caller_data
1111.52ms1.67msDevel::StackTrace::::BEGIN@12Devel::StackTrace::BEGIN@12
9111793µs1.13msDevel::StackTrace::::_ref_to_stringDevel::StackTrace::_ref_to_string
111538µs606µsDevel::StackTrace::::BEGIN@11Devel::StackTrace::BEGIN@11
811167µs3.00msDevel::StackTrace::::newDevel::StackTrace::new
11111µs11µsDevel::StackTrace::::BEGIN@6Devel::StackTrace::BEGIN@6
11110µs42µsDevel::StackTrace::::BEGIN@16Devel::StackTrace::BEGIN@16
1118µs34µsDevel::StackTrace::::BEGIN@13Devel::StackTrace::BEGIN@13
1117µs10µsDevel::StackTrace::::BEGIN@9Devel::StackTrace::BEGIN@9
1116µs16µsDevel::StackTrace::::BEGIN@8Devel::StackTrace::BEGIN@8
0000s0sDevel::StackTrace::::__ANON__[:105]Devel::StackTrace::__ANON__[:105]
0000s0sDevel::StackTrace::::__ANON__[:142]Devel::StackTrace::__ANON__[:142]
0000s0sDevel::StackTrace::::_add_frameDevel::StackTrace::_add_frame
0000s0sDevel::StackTrace::::_make_frame_filterDevel::StackTrace::_make_frame_filter
0000s0sDevel::StackTrace::::_make_framesDevel::StackTrace::_make_frames
0000s0sDevel::StackTrace::::as_stringDevel::StackTrace::as_string
0000s0sDevel::StackTrace::::frameDevel::StackTrace::frame
0000s0sDevel::StackTrace::::frame_countDevel::StackTrace::frame_count
0000s0sDevel::StackTrace::::framesDevel::StackTrace::frames
0000s0sDevel::StackTrace::::next_frameDevel::StackTrace::next_frame
0000s0sDevel::StackTrace::::prev_frameDevel::StackTrace::prev_frame
0000s0sDevel::StackTrace::::reset_pointerDevel::StackTrace::reset_pointer
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Devel::StackTrace;
2{
32900ns $Devel::StackTrace::VERSION = '1.30';
4}
5
6236µs111µs
# spent 11µs within Devel::StackTrace::BEGIN@6 which was called: # once (11µs+0s) by Exception::Class::Base::BEGIN@10 at line 6
use 5.006;
# spent 11µs making 1 call to Devel::StackTrace::BEGIN@6
7
8217µs225µs
# spent 16µs (6+9) within Devel::StackTrace::BEGIN@8 which was called: # once (6µs+9µs) by Exception::Class::Base::BEGIN@10 at line 8
use strict;
# spent 16µs making 1 call to Devel::StackTrace::BEGIN@8 # spent 9µs making 1 call to strict::import
9219µs213µs
# spent 10µs (7+3) within Devel::StackTrace::BEGIN@9 which was called: # once (7µs+3µs) by Exception::Class::Base::BEGIN@10 at line 9
use warnings;
# spent 10µs making 1 call to Devel::StackTrace::BEGIN@9 # spent 3µs making 1 call to warnings::import
10
11275µs1606µs
# spent 606µs (538+68) within Devel::StackTrace::BEGIN@11 which was called: # once (538µs+68µs) by Exception::Class::Base::BEGIN@10 at line 11
use Devel::StackTrace::Frame;
# spent 606µs making 1 call to Devel::StackTrace::BEGIN@11
12275µs11.67ms
# spent 1.67ms (1.52+158µs) within Devel::StackTrace::BEGIN@12 which was called: # once (1.52ms+158µs) by Exception::Class::Base::BEGIN@10 at line 12
use File::Spec;
# spent 1.67ms making 1 call to Devel::StackTrace::BEGIN@12
13228µs261µs
# spent 34µs (8+26) within Devel::StackTrace::BEGIN@13 which was called: # once (8µs+26µs) by Exception::Class::Base::BEGIN@10 at line 13
use Scalar::Util qw( blessed );
# spent 34µs making 1 call to Devel::StackTrace::BEGIN@13 # spent 26µs making 1 call to Exporter::import
14
15use overload
1618µs132µs
# spent 42µs (10+32) within Devel::StackTrace::BEGIN@16 which was called: # once (10µs+32µs) by Exception::Class::Base::BEGIN@10 at line 17
'""' => \&as_string,
# spent 32µs making 1 call to overload::import
171702µs142µs fallback => 1;
# spent 42µs making 1 call to Devel::StackTrace::BEGIN@16
18
19
# spent 3.00ms (167µs+2.83) within Devel::StackTrace::new which was called 8 times, avg 375µs/call: # 8 times (167µs+2.83ms) by Exception::Class::Base::_initialize at line 131 of Exception/Class/Base.pm, avg 375µs/call
sub new {
2084µs my $class = shift;
21820µs my %p = @_;
22
23 # Backwards compatibility - this parameter was renamed to no_refs
24 # ages ago.
2583µs $p{no_refs} = delete $p{no_object_refs}
26 if exists $p{no_object_refs};
27
28885µs my $self = bless {
29 index => undef,
30 frames => [],
31 raw => [],
32 %p,
33 }, $class;
34
35821µs82.83ms $self->_record_caller_data();
# spent 2.83ms making 8 calls to Devel::StackTrace::_record_caller_data, avg 354µs/call
36
37833µs return $self;
38}
39
40
# spent 2.83ms (1.70+1.13) within Devel::StackTrace::_record_caller_data which was called 8 times, avg 354µs/call: # 8 times (1.70ms+1.13ms) by Devel::StackTrace::new at line 35, avg 354µs/call
sub _record_caller_data {
4182µs my $self = shift;
42
43 # We exclude this method by starting one frame back.
4482µs my $x = 1;
458336µs while (
46 my @c
47 = $self->{no_args}
48 ? caller( $x++ )
49 : do {
50 package # the newline keeps dzil from adding a version here
51 DB;
5211336µs
53113369µs
54
55 ) {
56
5710513µs my @args;
58
5910588µs unless ( $self->{no_args} ) {
6010574µs @args = @DB::args;
61
6210562µs if ( $self->{no_refs} ) {
63285415µs911.13ms @args = map { ref $_ ? $self->_ref_to_string($_) : $_ } @args;
# spent 1.13ms making 91 calls to Devel::StackTrace::_ref_to_string, avg 12µs/call
64 }
65 }
66
67105207µs push @{ $self->{raw} },
68 {
69 caller => \@c,
70 args => \@args,
71 };
72 }
73}
74
75
# spent 1.13ms (793µs+341µs) within Devel::StackTrace::_ref_to_string which was called 91 times, avg 12µs/call: # 91 times (793µs+341µs) by Devel::StackTrace::_record_caller_data at line 63, avg 12µs/call
sub _ref_to_string {
769124µs my $self = shift;
779114µs my $ref = shift;
78
7991575µs145183µs return overload::AddrRef($ref)
# spent 82µs making 91 calls to Scalar::Util::blessed, avg 905ns/call # spent 81µs making 46 calls to UNIVERSAL::isa, avg 2µs/call # spent 19µs making 8 calls to overload::AddrRef, avg 2µs/call
80 if blessed $ref && $ref->isa('Exception::Class::Base');
81
8283345µs83158µs return overload::AddrRef($ref) unless $self->{respect_overload};
# spent 158µs making 83 calls to overload::AddrRef, avg 2µs/call
83
84 local $@;
85 local $SIG{__DIE__};
86
87 my $str = eval { $ref . '' };
88
89 return $@ ? overload::AddrRef($ref) : $str;
90}
91
92sub _make_frames {
93 my $self = shift;
94
95 my $filter = $self->_make_frame_filter;
96
97 my $raw = delete $self->{raw};
98 for my $r ( @{$raw} ) {
99 next unless $filter->($r);
100
101 $self->_add_frame( $r->{caller}, $r->{args} );
102 }
103}
104
10511µsmy $default_filter = sub { 1 };
106
107sub _make_frame_filter {
108 my $self = shift;
109
110 my ( @i_pack_re, %i_class );
111 if ( $self->{ignore_package} ) {
112 local $@;
113 local $SIG{__DIE__};
114
115 $self->{ignore_package} = [ $self->{ignore_package} ]
116 unless eval { @{ $self->{ignore_package} } };
117
118 @i_pack_re
119 = map { ref $_ ? $_ : qr/^\Q$_\E$/ } @{ $self->{ignore_package} };
120 }
121
122 my $p = __PACKAGE__;
123 push @i_pack_re, qr/^\Q$p\E$/;
124
125 if ( $self->{ignore_class} ) {
126 $self->{ignore_class} = [ $self->{ignore_class} ]
127 unless ref $self->{ignore_class};
128 %i_class = map { $_ => 1 } @{ $self->{ignore_class} };
129 }
130
131 my $user_filter = $self->{frame_filter};
132
133 return sub {
134 return 0 if grep { $_[0]{caller}[0] =~ /$_/ } @i_pack_re;
135 return 0 if grep { $_[0]{caller}[0]->isa($_) } keys %i_class;
136
137 if ($user_filter) {
138 return $user_filter->( $_[0] );
139 }
140
141 return 1;
142 };
143}
144
145sub _add_frame {
146 my $self = shift;
147 my $c = shift;
148 my $p = shift;
149
150 # eval and is_require are only returned when applicable under 5.00503.
151 push @$c, ( undef, undef ) if scalar @$c == 6;
152
153 push @{ $self->{frames} },
154 Devel::StackTrace::Frame->new(
155 $c,
156 $p,
157 $self->{respect_overload},
158 $self->{max_arg_length},
159 $self->{message},
160 $self->{indent}
161 );
162}
163
164sub next_frame {
165 my $self = shift;
166
167 # reset to top if necessary.
168 $self->{index} = -1 unless defined $self->{index};
169
170 my @f = $self->frames();
171 if ( defined $f[ $self->{index} + 1 ] ) {
172 return $f[ ++$self->{index} ];
173 }
174 else {
175 $self->{index} = undef;
176 return undef;
177 }
178}
179
180sub prev_frame {
181 my $self = shift;
182
183 my @f = $self->frames();
184
185 # reset to top if necessary.
186 $self->{index} = scalar @f unless defined $self->{index};
187
188 if ( defined $f[ $self->{index} - 1 ] && $self->{index} >= 1 ) {
189 return $f[ --$self->{index} ];
190 }
191 else {
192 $self->{index} = undef;
193 return undef;
194 }
195}
196
197sub reset_pointer {
198 my $self = shift;
199
200 $self->{index} = undef;
201}
202
203sub frames {
204 my $self = shift;
205
206 if (@_) {
207 die
208 "Devel::StackTrace->frames() can only take Devel::StackTrace::Frame args\n"
209 if grep { !$_->isa('Devel::StackTrace::Frame') } @_;
210
211 $self->{frames} = \@_;
212 }
213 else {
214 $self->_make_frames() if $self->{raw};
215 }
216
217 return @{ $self->{frames} };
218}
219
220sub frame {
221 my $self = shift;
222 my $i = shift;
223
224 return unless defined $i;
225
226 return ( $self->frames() )[$i];
227}
228
229sub frame_count {
230 my $self = shift;
231
232 return scalar( $self->frames() );
233}
234
235sub as_string {
236 my $self = shift;
237 my $p = shift;
238
239 my $st = '';
240 my $first = 1;
241 foreach my $f ( $self->frames() ) {
242 $st .= $f->as_string( $first, $p ) . "\n";
243 $first = 0;
244 }
245
246 return $st;
247}
248
249{
2501200ns package
251 Devel::StackTraceFrame;
252
25315µs our @ISA = 'Devel::StackTrace::Frame';
254}
255
25614µs1;
257
258# ABSTRACT: An object representing a stack trace
259
260__END__