← Index
NYTProf Performance Profile   « line view »
For svc/members/upsert
  Run on Tue Jan 13 11:50:22 2015
Reported on Tue Jan 13 12:09:47 2015

Filename/usr/share/perl5/Try/Tiny.pm
StatementsExecuted 150 statements in 998µs
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
52282µs9.53msTry::Tiny::::try Try::Tiny::try
11142µs1.25msTry::Tiny::::BEGIN@18 Try::Tiny::BEGIN@18
52220µs20µsTry::Tiny::::catch Try::Tiny::catch
11113µs32µsTry::Tiny::::BEGIN@12 Try::Tiny::BEGIN@12
11110µs10µsTry::Tiny::::BEGIN@6 Try::Tiny::BEGIN@6
11110µs44µsTry::Tiny::ScopeGuard::::BEGIN@144Try::Tiny::ScopeGuard::BEGIN@144
1119µs9µsTry::Tiny::::BEGIN@2 Try::Tiny::BEGIN@2
1118µs43µsTry::Tiny::::BEGIN@15 Try::Tiny::BEGIN@15
1117µs12µsTry::Tiny::::BEGIN@10 Try::Tiny::BEGIN@10
1116µs18µsTry::Tiny::::BEGIN@9 Try::Tiny::BEGIN@9
0000s0sTry::Tiny::ScopeGuard::::DESTROYTry::Tiny::ScopeGuard::DESTROY
0000s0sTry::Tiny::ScopeGuard::::_newTry::Tiny::ScopeGuard::_new
0000s0sTry::Tiny::::__ANON__[:18] Try::Tiny::__ANON__[:18]
0000s0sTry::Tiny::::finally Try::Tiny::finally
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Try::Tiny;
2
# spent 9µs within Try::Tiny::BEGIN@2 which was called: # once (9µs+0s) by Module::Implementation::BEGIN@9 at line 4
BEGIN {
3120µs $Try::Tiny::AUTHORITY = 'cpan:NUFFIN';
4128µs19µs}
# spent 9µs making 1 call to Try::Tiny::BEGIN@2
51500ns$Try::Tiny::VERSION = '0.22';
6246µs110µs
# spent 10µs within Try::Tiny::BEGIN@6 which was called: # once (10µs+0s) by Module::Implementation::BEGIN@9 at line 6
use 5.006;
# spent 10µs making 1 call to Try::Tiny::BEGIN@6
7# ABSTRACT: minimal try/catch with proper preservation of $@
8
9223µs230µs
# spent 18µs (6+12) within Try::Tiny::BEGIN@9 which was called: # once (6µs+12µs) by Module::Implementation::BEGIN@9 at line 9
use strict;
# spent 18µs making 1 call to Try::Tiny::BEGIN@9 # spent 12µs making 1 call to strict::import
10226µs216µs
# spent 12µs (7+4) within Try::Tiny::BEGIN@10 which was called: # once (7µs+4µs) by Module::Implementation::BEGIN@9 at line 10
use warnings;
# spent 12µs making 1 call to Try::Tiny::BEGIN@10 # spent 4µs making 1 call to warnings::import
11
12362µs352µs
# spent 32µs (13+19) within Try::Tiny::BEGIN@12 which was called: # once (13µs+19µs) by Module::Implementation::BEGIN@9 at line 12
use Exporter 5.57 'import';
# spent 32µs making 1 call to Try::Tiny::BEGIN@12 # spent 11µs making 1 call to UNIVERSAL::VERSION # spent 8µs making 1 call to Exporter::import
1311µsour @EXPORT = our @EXPORT_OK = qw(try catch finally);
14
15250µs279µs
# spent 43µs (8+36) within Try::Tiny::BEGIN@15 which was called: # once (8µs+36µs) by Module::Implementation::BEGIN@9 at line 15
use Carp;
# spent 43µs making 1 call to Try::Tiny::BEGIN@15 # spent 36µs making 1 call to Exporter::import
161700ns$Carp::Internal{+__PACKAGE__}++;
17
181445µs11.25ms
# spent 1.25ms (42µs+1.21) within Try::Tiny::BEGIN@18 which was called: # once (42µs+1.21ms) by Module::Implementation::BEGIN@9 at line 18
BEGIN { eval "use Sub::Name; 1" or *{subname} = sub {1} }
# spent 1.25ms making 1 call to Try::Tiny::BEGIN@18
# spent 797µs executing statements in string eval
# includes 965µs spent executing 1 call to 1 sub defined therein.
19
20# Need to prototype as @ not $$ because of the way Perl evaluates the prototype.
21# Keeping it at $$ means you only ever get 1 sub because we need to eval in a list
22# context & not a scalar one
23
24
# spent 9.53ms (82µs+9.45) within Try::Tiny::try which was called 5 times, avg 1.91ms/call: # 4 times (59µs+9.26ms) by Module::Implementation::_load_implementation at line 98 of Module/Implementation.pm, avg 2.33ms/call # once (23µs+194µs) by C4::Circulation::BEGIN@24 at line 39 of DateTime.pm
sub try (&;@) {
2553µs my ( $try, @code_refs ) = @_;
26
27 # we need to save this here, the eval block will be in scalar context due
28 # to $failed
2951µs my $wantarray = wantarray;
30
31 # work around perl bug by explicitly initializing these, due to the likelyhood
32 # this will be used in global destruction (perl rt#119311)
3352µs my ( $catch, @finally ) = ();
34
35 # find labeled blocks in the argument list.
36 # catch and finally tag the blocks by blessing a scalar reference to them.
3753µs foreach my $code_ref (@code_refs) {
38
3957µs if ( ref($code_ref) eq 'Try::Tiny::Catch' ) {
405500ns croak 'A try() may not be followed by multiple catch() blocks'
41 if $catch;
4252µs $catch = ${$code_ref};
43 } elsif ( ref($code_ref) eq 'Try::Tiny::Finally' ) {
44 push @finally, ${$code_ref};
45 } else {
46 croak(
47 'try() encountered an unexpected argument ('
48 . ( defined $code_ref ? $code_ref : 'undef' )
49 . ') - perhaps a missing semi-colon before or'
50 );
51 }
52 }
53
54 # FIXME consider using local $SIG{__DIE__} to accumulate all errors. It's
55 # not perfect, but we could provide a list of additional errors for
56 # $catch->();
57
58 # name the blocks if we have Sub::Name installed
5952µs my $caller = caller;
60541µs528µs subname("${caller}::try {...} " => $try);
# spent 28µs making 5 calls to Sub::Name::subname, avg 6µs/call
61520µs511µs subname("${caller}::catch {...} " => $catch) if $catch;
# spent 11µs making 5 calls to Sub::Name::subname, avg 2µs/call
6253µs subname("${caller}::finally {...} " => $_) foreach @finally;
63
64 # save the value of $@ so we can set $@ back to it in the beginning of the eval
65 # and restore $@ after the eval finishes
6651µs my $prev_error = $@;
67
685800ns my ( @ret, $error );
69
70 # failed will be true if the eval dies, because 1 will not be returned
71 # from the eval body
7253µs my $failed = not eval {
7351µs $@ = $prev_error;
74
75 # evaluate the try block in the correct context
7652µs if ( $wantarray ) {
77 @ret = $try->();
78 } elsif ( defined $wantarray ) {
79 $ret[0] = $try->();
80 } else {
8154µs59.41ms $try->();
# spent 9.23ms making 4 calls to Module::Implementation::try {...} , avg 2.31ms/call # spent 186µs making 1 call to DateTime::try {...}
82 };
83
8452µs return 1; # properly set $fail to false
85 };
86
87 # preserve the current error and reset the original value of $@
8851µs $error = $@;
895900ns $@ = $prev_error;
90
91 # set up a scope guard to invoke the finally block at the end
92 my @guards =
9353µs map { Try::Tiny::ScopeGuard->_new($_, $failed ? $error : ()) }
94 @finally;
95
96 # at this point $failed contains a true value if the eval died, even if some
97 # destructor overwrote $@ as the eval was unwinding.
9852µs if ( $failed ) {
99 # if we got an error, invoke the catch block.
100 if ( $catch ) {
101 # This works like given($error), but is backwards compatible and
102 # sets $_ in the dynamic scope for the body of C<$catch>
103 for ($error) {
104 return $catch->($error);
105 }
106
107 # in case when() was used without an explicit return, the C<for>
108 # loop will be aborted and there's no useful return value
109 }
110
111 return;
112 } else {
113 # no failure, $@ is back to what it was, everything is fine
114514µs return $wantarray ? @ret : $ret[0];
115 }
116}
117
118
# spent 20µs within Try::Tiny::catch which was called 5 times, avg 4µs/call: # 4 times (14µs+0s) by Module::Implementation::_load_implementation at line 98 of Module/Implementation.pm, avg 3µs/call # once (6µs+0s) by C4::Circulation::BEGIN@24 at line 39 of DateTime.pm
sub catch (&;@) {
11953µs my ( $block, @rest ) = @_;
120
12151µs croak 'Useless bare catch()' unless wantarray;
122
123 return (
124523µs bless(\$block, 'Try::Tiny::Catch'),
125 @rest,
126 );
127}
128
129sub finally (&;@) {
130 my ( $block, @rest ) = @_;
131
132 croak 'Useless bare finally()' unless wantarray;
133
134 return (
135 bless(\$block, 'Try::Tiny::Finally'),
136 @rest,
137 );
138}
139
140{
1411500ns package # hide from PAUSE
142 Try::Tiny::ScopeGuard;
143
1442144µs278µs
# spent 44µs (10+34) within Try::Tiny::ScopeGuard::BEGIN@144 which was called: # once (10µs+34µs) by Module::Implementation::BEGIN@9 at line 144
use constant UNSTABLE_DOLLARAT => ($] < '5.013002') ? 1 : 0;
# spent 44µs making 1 call to Try::Tiny::ScopeGuard::BEGIN@144 # spent 34µs making 1 call to constant::import
145
146 sub _new {
147 shift;
148 bless [ @_ ];
149 }
150
151 sub DESTROY {
152 my ($code, @args) = @{ $_[0] };
153
154 local $@ if UNSTABLE_DOLLARAT;
155 eval {
156 $code->(@args);
157 1;
158 } or do {
159 warn
160 "Execution of finally() block $code resulted in an exception, which "
161 . '*CAN NOT BE PROPAGATED* due to fundamental limitations of Perl. '
162 . 'Your program will continue as if this event never took place. '
163 . "Original exception text follows:\n\n"
164 . (defined $@ ? $@ : '$@ left undefined...')
165 . "\n"
166 ;
167 }
168 }
169}
170
171__PACKAGE__
172__END__
17314µs