← 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:51 2015

Filename/usr/share/perl5/JSON.pm
StatementsExecuted 95 statements in 3.79ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
1111.32ms25.7msJSON::::_load_xs JSON::_load_xs
1111.31ms1.31msJSON::::CORE:readline JSON::CORE:readline (opcode)
221247µs318µsJSON::Boolean::::_overrride_overload JSON::Boolean::_overrride_overload
11146µs46µsJSON::::_set_module JSON::_set_module
11132µs47µsJSON::::to_json JSON::to_json
22229µs224µsJSON::::import JSON::import
11111µs23µsJSON::::BEGIN@4 JSON::BEGIN@4
11110µs19µsJSON::Backend::PP::::BEGIN@398JSON::Backend::PP::BEGIN@398
1118µs20µsJSON::::BEGIN@318 JSON::BEGIN@318
1118µs70µsJSON::::BEGIN@6 JSON::BEGIN@6
1115µs5µsJSON::::CORE:close JSON::CORE:close (opcode)
1114µs4µsJSON::::BEGIN@9 JSON::BEGIN@9
1114µs4µsJSON::::BEGIN@5 JSON::BEGIN@5
0000s0sJSON::Backend::PP::::__ANON__[:401]JSON::Backend::PP::__ANON__[:401]
0000s0sJSON::Backend::PP::::__ANON__[:402]JSON::Backend::PP::__ANON__[:402]
0000s0sJSON::Backend::PP::::initJSON::Backend::PP::init
0000s0sJSON::Boolean::::__ANON__[:375] JSON::Boolean::__ANON__[:375]
0000s0sJSON::Boolean::::__ANON__[:376] JSON::Boolean::__ANON__[:376]
0000s0sJSON::Boolean::::__ANON__[:382] JSON::Boolean::__ANON__[:382]
0000s0sJSON::Boolean::::__ANON__[:383] JSON::Boolean::__ANON__[:383]
0000s0sJSON::::__ANON__[:332] JSON::__ANON__[:332]
0000s0sJSON::::_load_pp JSON::_load_pp
0000s0sJSON::::backend JSON::backend
0000s0sJSON::::false JSON::false
0000s0sJSON::::from_json JSON::from_json
0000s0sJSON::::is_pp JSON::is_pp
0000s0sJSON::::is_xs JSON::is_xs
0000s0sJSON::::jsonToObj JSON::jsonToObj
0000s0sJSON::::null JSON::null
0000s0sJSON::::objToJson JSON::objToJson
0000s0sJSON::::property JSON::property
0000s0sJSON::::pureperl_only_methods JSON::pureperl_only_methods
0000s0sJSON::::require_xs_version JSON::require_xs_version
0000s0sJSON::::true JSON::true
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package JSON;
2
3
4223µs235µs
# spent 23µs (11+12) within JSON::BEGIN@4 which was called: # once (11µs+12µs) by C4::Auth::BEGIN@23 at line 4
use strict;
# spent 23µs making 1 call to JSON::BEGIN@4 # spent 12µs making 1 call to strict::import
5219µs14µs
# spent 4µs within JSON::BEGIN@5 which was called: # once (4µs+0s) by C4::Auth::BEGIN@23 at line 5
use Carp ();
# spent 4µs making 1 call to JSON::BEGIN@5
6255µs2132µs
# spent 70µs (8+62) within JSON::BEGIN@6 which was called: # once (8µs+62µs) by C4::Auth::BEGIN@23 at line 6
use base qw(Exporter);
# spent 70µs making 1 call to JSON::BEGIN@6 # spent 62µs making 1 call to base::import
711µs@JSON::EXPORT = qw(from_json to_json jsonToObj objToJson encode_json decode_json);
8
9
# spent 4µs within JSON::BEGIN@9 which was called: # once (4µs+0s) by C4::Auth::BEGIN@23 at line 13
BEGIN {
101300ns $JSON::VERSION = '2.61';
111200ns $JSON::DEBUG = 0 unless (defined $JSON::DEBUG);
1213µs $JSON::DEBUG = $ENV{ PERL_JSON_DEBUG } if exists $ENV{ PERL_JSON_DEBUG };
1311.06ms14µs}
# spent 4µs making 1 call to JSON::BEGIN@9
14
151200nsmy $Module_XS = 'JSON::XS';
161100nsmy $Module_PP = 'JSON::PP';
171100nsmy $Module_bp = 'JSON::backportPP'; # included in JSON distribution
181100nsmy $PP_Version = '2.27203';
191100nsmy $XS_Version = '2.34';
20
21
22# XS and PP common methods
23
2411µsmy @PublicMethods = qw/
25 ascii latin1 utf8 pretty indent space_before space_after relaxed canonical allow_nonref
26 allow_blessed convert_blessed filter_json_object filter_json_single_key_object
27 shrink max_depth max_size encode decode decode_prefix allow_unknown
28/;
29
301900nsmy @Properties = qw/
31 ascii latin1 utf8 indent space_before space_after relaxed canonical allow_nonref
32 allow_blessed convert_blessed shrink max_depth max_size allow_unknown
33/;
34
351100nsmy @XSOnlyMethods = qw//; # Currently nothing
36
371500nsmy @PPOnlyMethods = qw/
38 indent_length sort_by
39 allow_singlequote allow_bignum loose allow_barekey escape_slash as_nonblessed
40/; # JSON::PP specific
41
42
43# used in _load_xs and _load_pp ($INSTALL_ONLY is not used currently)
441100nsmy $_INSTALL_DONT_DIE = 1; # When _load_xs fails to load XS, don't die.
451100nsmy $_INSTALL_ONLY = 2; # Don't call _set_methods()
4610smy $_ALLOW_UNSUPPORTED = 0;
4710smy $_UNIV_CONV_BLESSED = 0;
481100nsmy $_USSING_bpPP = 0;
49
50
51# Check the environment variable to decide worker module.
52
531200nsunless ($JSON::Backend) {
541100ns $JSON::DEBUG and Carp::carp("Check used worker module...");
55
561700ns my $backend = exists $ENV{PERL_JSON_BACKEND} ? $ENV{PERL_JSON_BACKEND} : 1;
57
5812µs125.7ms if ($backend eq '1' or $backend =~ /JSON::XS\s*,\s*JSON::PP/) {
# spent 25.7ms making 1 call to JSON::_load_xs
59 _load_xs($_INSTALL_DONT_DIE) or _load_pp();
60 }
61 elsif ($backend eq '0' or $backend eq 'JSON::PP') {
62 _load_pp();
63 }
64 elsif ($backend eq '2' or $backend eq 'JSON::XS') {
65 _load_xs();
66 }
67 elsif ($backend eq 'JSON::backportPP') {
68 $_USSING_bpPP = 1;
69 _load_pp();
70 }
71 else {
72 Carp::croak "The value of environmental variable 'PERL_JSON_BACKEND' is invalid.";
73 }
74}
75
76
77
# spent 224µs (29+194) within JSON::import which was called 2 times, avg 112µs/call: # once (19µs+116µs) by C4::Auth::BEGIN@23 at line 23 of C4/Auth.pm # once (10µs+79µs) by C4::Output::JSONStream::BEGIN@42 at line 42 of C4/Output/JSONStream.pm
sub import {
7821µs my $pkg = shift;
792700ns my @what_to_export;
80 my $no_export;
81
8222µs for my $tag (@_) {
8321µs if ($tag eq '-support_by_pp') {
84 if (!$_ALLOW_UNSUPPORTED++) {
85 JSON::Backend::XS
86 ->support_by_pp(@PPOnlyMethods) if ($JSON::Backend eq $Module_XS);
87 }
88 next;
89 }
90 elsif ($tag eq '-no_export') {
91 $no_export++, next;
92 }
93 elsif ( $tag eq '-convert_blessed_universally' ) {
94 eval q|
95 require B;
96 *UNIVERSAL::TO_JSON = sub {
97 my $b_obj = B::svref_2object( $_[0] );
98 return $b_obj->isa('B::HV') ? { %{ $_[0] } }
99 : $b_obj->isa('B::AV') ? [ @{ $_[0] } ]
100 : undef
101 ;
102 }
103 | if ( !$_UNIV_CONV_BLESSED++ );
104 next;
105 }
10621µs push @what_to_export, $tag;
107 }
108
1092500ns return if ($no_export);
110
111215µs238µs __PACKAGE__->export_to_level(1, $pkg, @what_to_export);
# spent 38µs making 2 calls to Exporter::export_to_level, avg 19µs/call
112}
113
114
115# OBSOLETED
116
117sub jsonToObj {
118 my $alternative = 'from_json';
119 if (defined $_[0] and UNIVERSAL::isa($_[0], 'JSON')) {
120 shift @_; $alternative = 'decode';
121 }
122 Carp::carp "'jsonToObj' will be obsoleted. Please use '$alternative' instead.";
123 return JSON::from_json(@_);
124};
125
126sub objToJson {
127 my $alternative = 'to_json';
128 if (defined $_[0] and UNIVERSAL::isa($_[0], 'JSON')) {
129 shift @_; $alternative = 'encode';
130 }
131 Carp::carp "'objToJson' will be obsoleted. Please use '$alternative' instead.";
132 JSON::to_json(@_);
133};
134
135
136# INTERFACES
137
138
# spent 47µs (32+15) within JSON::to_json which was called: # once (32µs+15µs) by C4::Output::JSONStream::output at line 71 of C4/Output/JSONStream.pm
sub to_json ($@) {
13912µs if (
140 ref($_[0]) eq 'JSON'
141 or (@_ > 2 and $_[0] eq 'JSON')
142 ) {
143 Carp::croak "to_json should not be called as a method.";
144 }
145116µs16µs my $json = JSON->new;
# spent 6µs making 1 call to JSON::XS::new
146
1471500ns if (@_ == 2 and ref $_[1] eq 'HASH') {
148 my $opt = $_[1];
149 for my $method (keys %$opt) {
150 $json->$method( $opt->{$method} );
151 }
152 }
153
154130µs18µs $json->encode($_[0]);
# spent 8µs making 1 call to JSON::XS::encode
155}
156
157
158sub from_json ($@) {
159 if ( ref($_[0]) eq 'JSON' or $_[0] eq 'JSON' ) {
160 Carp::croak "from_json should not be called as a method.";
161 }
162 my $json = JSON->new;
163
164 if (@_ == 2 and ref $_[1] eq 'HASH') {
165 my $opt = $_[1];
166 for my $method (keys %$opt) {
167 $json->$method( $opt->{$method} );
168 }
169 }
170
171 return $json->decode( $_[0] );
172}
173
174
175sub true { $JSON::true }
176
177sub false { $JSON::false }
178
179sub null { undef; }
180
181
182sub require_xs_version { $XS_Version; }
183
184sub backend {
185 my $proto = shift;
186 $JSON::Backend;
187}
188
189#*module = *backend;
190
191
192sub is_xs {
193 return $_[0]->backend eq $Module_XS;
194}
195
196
197sub is_pp {
198 return not $_[0]->is_xs;
199}
200
201
202sub pureperl_only_methods { @PPOnlyMethods; }
203
204
205sub property {
206 my ($self, $name, $value) = @_;
207
208 if (@_ == 1) {
209 my %props;
210 for $name (@Properties) {
211 my $method = 'get_' . $name;
212 if ($name eq 'max_size') {
213 my $value = $self->$method();
214 $props{$name} = $value == 1 ? 0 : $value;
215 next;
216 }
217 $props{$name} = $self->$method();
218 }
219 return \%props;
220 }
221 elsif (@_ > 3) {
222 Carp::croak('property() can take only the option within 2 arguments.');
223 }
224 elsif (@_ == 2) {
225 if ( my $method = $self->can('get_' . $name) ) {
226 if ($name eq 'max_size') {
227 my $value = $self->$method();
228 return $value == 1 ? 0 : $value;
229 }
230 $self->$method();
231 }
232 }
233 else {
234 $self->$name($value);
235 }
236
237}
238
- -
241# INTERNAL
242
243
# spent 25.7ms (1.32+24.3) within JSON::_load_xs which was called: # once (1.32ms+24.3ms) by C4::Auth::BEGIN@23 at line 58
sub _load_xs {
2441200ns my $opt = shift;
245
2461100ns $JSON::DEBUG and Carp::carp "Load $Module_XS.";
247
248 # if called after install module, overload is disable.... why?
2491500ns1165µs JSON::Boolean::_overrride_overload($Module_XS);
# spent 165µs making 1 call to JSON::Boolean::_overrride_overload
2501800ns1153µs JSON::Boolean::_overrride_overload($Module_PP);
# spent 153µs making 1 call to JSON::Boolean::_overrride_overload
251
252136µs eval qq|
# spent 9.13ms executing statements in string eval
# includes 10.1ms spent executing 1 call to 1 sub defined therein.
253 use $Module_XS $XS_Version ();
254 |;
255
2561300ns if ($@) {
257 if (defined $opt and $opt & $_INSTALL_DONT_DIE) {
258 $JSON::DEBUG and Carp::carp "Can't load $Module_XS...($@)";
259 return 0;
260 }
261 Carp::croak $@;
262 }
263
2641900ns unless (defined $opt and $opt & $_INSTALL_ONLY) {
26512µs146µs _set_module( $JSON::Backend = $Module_XS );
# spent 46µs making 1 call to JSON::_set_module
26611.43ms11.31ms my $data = join("", <DATA>); # this code is from Jcode 2.xx.
# spent 1.31ms making 1 call to JSON::CORE:readline
267111µs15µs close(DATA);
# spent 5µs making 1 call to JSON::CORE:close
2681273µs eval $data;
# spent 912µs executing statements in string eval
# includes 68µs spent executing 7 calls to 21 subs defined therein.
26913µs116µs JSON::Backend::XS->init;
# spent 16µs making 1 call to JSON::Backend::XS::init
270 }
271
27213µs return 1;
273};
274
275
276sub _load_pp {
277 my $opt = shift;
278 my $backend = $_USSING_bpPP ? $Module_bp : $Module_PP;
279
280 $JSON::DEBUG and Carp::carp "Load $backend.";
281
282 # if called after install module, overload is disable.... why?
283 JSON::Boolean::_overrride_overload($Module_XS);
284 JSON::Boolean::_overrride_overload($backend);
285
286 if ( $_USSING_bpPP ) {
287 eval qq| require $backend |;
288 }
289 else {
290 eval qq| use $backend $PP_Version () |;
291 }
292
293 if ($@) {
294 if ( $backend eq $Module_PP ) {
295 $JSON::DEBUG and Carp::carp "Can't load $Module_PP ($@), so try to load $Module_bp";
296 $_USSING_bpPP++;
297 $backend = $Module_bp;
298 JSON::Boolean::_overrride_overload($backend);
299 local $^W; # if PP installed but invalid version, backportPP redefines methods.
300 eval qq| require $Module_bp |;
301 }
302 Carp::croak $@ if $@;
303 }
304
305 unless (defined $opt and $opt & $_INSTALL_ONLY) {
306 _set_module( $JSON::Backend = $Module_PP ); # even if backportPP, set $Backend with 'JSON::PP'
307 JSON::Backend::PP->init;
308 }
309};
310
311
312
# spent 46µs within JSON::_set_module which was called: # once (46µs+0s) by JSON::_load_xs at line 265
sub _set_module {
3131200ns return if defined $JSON::true;
314
3151300ns my $module = shift;
316
31712µs local $^W;
3182358µs231µs
# spent 20µs (8+11) within JSON::BEGIN@318 which was called: # once (8µs+11µs) by C4::Auth::BEGIN@23 at line 318
no strict qw(refs);
# spent 20µs making 1 call to JSON::BEGIN@318 # spent 11µs making 1 call to strict::unimport
319
32012µs $JSON::true = ${"$module\::true"};
3211600ns $JSON::false = ${"$module\::false"};
322
32319µs push @JSON::ISA, $module;
32417µs push @{"$module\::Boolean::ISA"}, qw(JSON::Boolean);
325
32613µs *{"JSON::is_bool"} = \&{"$module\::is_bool"};
327
32811µs for my $method ($module eq $Module_XS ? @PPOnlyMethods : @XSOnlyMethods) {
329 *{"JSON::$method"} = sub {
330 Carp::carp("$method is not supported in $module.");
331 $_[0];
332819µs };
333 }
334
33514µs return 1;
336}
337
- -
340#
341# JSON Boolean
342#
343
344package JSON::Boolean;
345
3461200nsmy %Installed;
347
348
# spent 318µs (247+71) within JSON::Boolean::_overrride_overload which was called 2 times, avg 159µs/call: # once (122µs+43µs) by JSON::_load_xs at line 249 # once (124µs+28µs) by JSON::_load_xs at line 250
sub _overrride_overload {
34921µs return if ($Installed{ $_[0] }++);
350
35121µs my $boolean = $_[0] . '::Boolean';
352
3532237µs eval sprintf(q|
# spent 15µs executing statements in string eval
# includes 14µs spent executing 1 call to 3 subs defined therein. # spent 11µs executing statements in string eval
# includes 10µs spent executing 1 call to 3 subs defined therein.
354 package %s;
355 use overload (
356 '""' => sub { ${$_[0]} == 1 ? 'true' : 'false' },
357 'eq' => sub {
358 my ($obj, $op) = ref ($_[0]) ? ($_[0], $_[1]) : ($_[1], $_[0]);
359 if ($op eq 'true' or $op eq 'false') {
360 return "$obj" eq 'true' ? 'true' eq $op : 'false' eq $op;
361 }
362 else {
363 return $obj ? 1 == $op : 0 == $op;
364 }
365 },
366 );
367 |, $boolean);
368
3692200ns if ($@) { Carp::croak $@; }
370
37121µs if ( exists $INC{'JSON/XS.pm'} and $boolean eq 'JSON::XS::Boolean' ) {
372 local $^W;
373 my $true = do { bless \(my $dummy = 1), $boolean };
374 my $false = do { bless \(my $dummy = 0), $boolean };
375 *JSON::XS::true = sub () { $true };
376 *JSON::XS::false = sub () { $false };
377 }
378 elsif ( exists $INC{'JSON/PP.pm'} and $boolean eq 'JSON::PP::Boolean' ) {
379 local $^W;
380 my $true = do { bless \(my $dummy = 1), $boolean };
381 my $false = do { bless \(my $dummy = 0), $boolean };
382 *JSON::PP::true = sub { $true };
383 *JSON::PP::false = sub { $false };
384 }
385
38627µs return 1;
387}
388
389
390#
391# Helper classes for Backend Module (PP)
392#
393
394package JSON::Backend::PP;
395
396sub init {
397 local $^W;
3982107µs228µs
# spent 19µs (10+9) within JSON::Backend::PP::BEGIN@398 which was called: # once (10µs+9µs) by C4::Auth::BEGIN@23 at line 398
no strict qw(refs); # this routine may be called after JSON::Backend::XS init was called.
# spent 19µs making 1 call to JSON::Backend::PP::BEGIN@398 # spent 9µs making 1 call to strict::unimport
399 *{"JSON::decode_json"} = \&{"JSON::PP::decode_json"};
400 *{"JSON::encode_json"} = \&{"JSON::PP::encode_json"};
401 *{"JSON::PP::is_xs"} = sub { 0 };
402 *{"JSON::PP::is_pp"} = sub { 1 };
403 return 1;
404}
405
406#
407# To save memory, the below lines are read only when XS backend is used.
408#
409
410package JSON;
411
412122µs1;
413__DATA__
 
# spent 5µs within JSON::CORE:close which was called: # once (5µs+0s) by JSON::_load_xs at line 267
sub JSON::CORE:close; # opcode
# spent 1.31ms within JSON::CORE:readline which was called: # once (1.31ms+0s) by JSON::_load_xs at line 266
sub JSON::CORE:readline; # opcode