← Index
NYTProf Performance Profile   « block view • line view • sub view »
For /usr/share/koha/opac/cgi-bin/opac/opac-search.pl
  Run on Tue Oct 15 17:10:45 2013
Reported on Tue Oct 15 17:12:48 2013

Filename/usr/lib/perl5/XML/LibXSLT.pm
StatementsExecuted 1312 statements in 64.8ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
11110.1ms10.1msXML::LibXSLT::::_parse_stylesheet XML::LibXSLT::_parse_stylesheet (xsub)
25111.12ms2.01msXML::LibXSLT::StylesheetWrapper::::_init_callbacksXML::LibXSLT::StylesheetWrapper::_init_callbacks
2511915µs47.5msXML::LibXSLT::StylesheetWrapper::::transformXML::LibXSLT::StylesheetWrapper::transform
2511467µs924µsXML::LibXSLT::StylesheetWrapper::::_cleanup_callbacksXML::LibXSLT::StylesheetWrapper::_cleanup_callbacks
5021278µs278µsXML::LibXSLT::StylesheetWrapper::::match_callbackXML::LibXSLT::StylesheetWrapper::match_callback
111261µs261µsXML::LibXSLT::::bootstrap XML::LibXSLT::bootstrap (xsub)
2511248µs1.79msXML::LibXSLT::StylesheetWrapper::::output_stringXML::LibXSLT::StylesheetWrapper::output_string
2511152µs152µsXML::LibXSLT::StylesheetWrapper::::read_callbackXML::LibXSLT::StylesheetWrapper::read_callback
2511151µs151µsXML::LibXSLT::StylesheetWrapper::::open_callbackXML::LibXSLT::StylesheetWrapper::open_callback
2511127µs127µsXML::LibXSLT::StylesheetWrapper::::close_callbackXML::LibXSLT::StylesheetWrapper::close_callback
2621112µs112µsXML::LibXSLT::::lib_init_callbacks XML::LibXSLT::lib_init_callbacks (xsub)
111101µs909µsXML::LibXSLT::::BEGIN@23 XML::LibXSLT::BEGIN@23
11163µs10.3msXML::LibXSLT::::parse_stylesheet XML::LibXSLT::parse_stylesheet
11161µs120µsXML::LibXSLT::::_init_callbacks XML::LibXSLT::_init_callbacks
11136µs47µsXML::LibXSLT::::BEGIN@11 XML::LibXSLT::BEGIN@11
11134µs152µsXML::LibXSLT::StylesheetWrapper::::BEGIN@310XML::LibXSLT::StylesheetWrapper::BEGIN@310
11127µs27µsXML::LibXSLT::::new XML::LibXSLT::new
11126µs34µsXML::LibXSLT::Security::::BEGIN@503 XML::LibXSLT::Security::BEGIN@503
11126µs498µsXML::LibXSLT::::BEGIN@16 XML::LibXSLT::BEGIN@16
11123µs29µsXML::LibXSLT::::BEGIN@17 XML::LibXSLT::BEGIN@17
11123µs113µsXML::LibXSLT::StylesheetWrapper::::BEGIN@313XML::LibXSLT::StylesheetWrapper::BEGIN@313
11123µs102µsXML::LibXSLT::::BEGIN@24 XML::LibXSLT::BEGIN@24
11122µs26µsXML::LibXSLT::::BEGIN@20 XML::LibXSLT::BEGIN@20
11122µs25µsXML::LibXSLT::::BEGIN@18 XML::LibXSLT::BEGIN@18
11121µs57µsXML::LibXSLT::::BEGIN@79 XML::LibXSLT::BEGIN@79
11121µs27µsXML::LibXSLT::StylesheetWrapper::::BEGIN@309XML::LibXSLT::StylesheetWrapper::BEGIN@309
11121µs24µsXML::LibXSLT::::BEGIN@19 XML::LibXSLT::BEGIN@19
11121µs112µsXML::LibXSLT::Security::::BEGIN@504 XML::LibXSLT::Security::BEGIN@504
11118µs219µsXML::LibXSLT::::BEGIN@12 XML::LibXSLT::BEGIN@12
11118µs99µsXML::LibXSLT::Security::::BEGIN@506 XML::LibXSLT::Security::BEGIN@506
11118µs466µsXML::LibXSLT::StylesheetWrapper::::BEGIN@312XML::LibXSLT::StylesheetWrapper::BEGIN@312
11116µs37µsXML::LibXSLT::::_cleanup_callbacks XML::LibXSLT::_cleanup_callbacks
22112µs12µsXML::LibXSLT::::match_callback XML::LibXSLT::match_callback
1115µs5µsXML::LibXSLT::::read_callback XML::LibXSLT::read_callback
1115µs5µsXML::LibXSLT::::open_callback XML::LibXSLT::open_callback
1114µs4µsXML::LibXSLT::::close_callback XML::LibXSLT::close_callback
1113µs3µsXML::LibXSLT::::REQUIRE_XML_LIBXML_ABI_VERSION XML::LibXSLT::REQUIRE_XML_LIBXML_ABI_VERSION
0000s0sXML::LibXSLT::Security::::_security_check XML::LibXSLT::Security::_security_check
0000s0sXML::LibXSLT::Security::::cleanup_callbacks XML::LibXSLT::Security::cleanup_callbacks
0000s0sXML::LibXSLT::Security::::init_callbacks XML::LibXSLT::Security::init_callbacks
0000s0sXML::LibXSLT::Security::::new XML::LibXSLT::Security::new
0000s0sXML::LibXSLT::Security::::register_callback XML::LibXSLT::Security::register_callback
0000s0sXML::LibXSLT::Security::::unregister_callback XML::LibXSLT::Security::unregister_callback
0000s0sXML::LibXSLT::StylesheetWrapper::::callbacksXML::LibXSLT::StylesheetWrapper::callbacks
0000s0sXML::LibXSLT::StylesheetWrapper::::input_callbacksXML::LibXSLT::StylesheetWrapper::input_callbacks
0000s0sXML::LibXSLT::StylesheetWrapper::::media_typeXML::LibXSLT::StylesheetWrapper::media_type
0000s0sXML::LibXSLT::StylesheetWrapper::::output_as_bytesXML::LibXSLT::StylesheetWrapper::output_as_bytes
0000s0sXML::LibXSLT::StylesheetWrapper::::output_as_charsXML::LibXSLT::StylesheetWrapper::output_as_chars
0000s0sXML::LibXSLT::StylesheetWrapper::::output_encodingXML::LibXSLT::StylesheetWrapper::output_encoding
0000s0sXML::LibXSLT::StylesheetWrapper::::output_fhXML::LibXSLT::StylesheetWrapper::output_fh
0000s0sXML::LibXSLT::StylesheetWrapper::::output_fileXML::LibXSLT::StylesheetWrapper::output_file
0000s0sXML::LibXSLT::StylesheetWrapper::::security_callbacksXML::LibXSLT::StylesheetWrapper::security_callbacks
0000s0sXML::LibXSLT::StylesheetWrapper::::transform_fileXML::LibXSLT::StylesheetWrapper::transform_file
0000s0sXML::LibXSLT::::callbacks XML::LibXSLT::callbacks
0000s0sXML::LibXSLT::::input_callbacks XML::LibXSLT::input_callbacks
0000s0sXML::LibXSLT::::parse_stylesheet_file XML::LibXSLT::parse_stylesheet_file
0000s0sXML::LibXSLT::::perl_dispatcher XML::LibXSLT::perl_dispatcher
0000s0sXML::LibXSLT::::register_xslt_module XML::LibXSLT::register_xslt_module
0000s0sXML::LibXSLT::::security_callbacks XML::LibXSLT::security_callbacks
0000s0sXML::LibXSLT::::xpath_to_string XML::LibXSLT::xpath_to_string
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1# $Id: LibXSLT.pm 228 2009-10-07 12:25:23Z pajas $
2#
3# This is free software, you may use it and distribute it under the same terms as
4# Perl itself.
5#
6# Copyright 2001-2009 AxKit.com Ltd.
7#
8#
9package XML::LibXSLT;
10
11382µs258µs
# spent 47µs (36+11) within XML::LibXSLT::BEGIN@11 which was called: # once (36µs+11µs) by C4::XSLT::BEGIN@35 at line 11
use strict;
# spent 47µs making 1 call to XML::LibXSLT::BEGIN@11 # spent 11µs making 1 call to strict::import
123108µs2421µs
# spent 219µs (18+201) within XML::LibXSLT::BEGIN@12 which was called: # once (18µs+201µs) by C4::XSLT::BEGIN@35 at line 12
use vars qw($VERSION @ISA $USE_LIBXML_DATA_TYPES $MatchCB $ReadCB $OpenCB $CloseCB);
# spent 219µs making 1 call to XML::LibXSLT::BEGIN@12 # spent 201µs making 1 call to vars::import
13
1417µs
# spent 3µs within XML::LibXSLT::REQUIRE_XML_LIBXML_ABI_VERSION which was called: # once (3µs+0s) by XML::LibXML::VERSION at line 41 of XML/LibXML.pm
sub REQUIRE_XML_LIBXML_ABI_VERSION { 2 }
15
16363µs3971µs
# spent 498µs (26+473) within XML::LibXSLT::BEGIN@16 which was called: # once (26µs+473µs) by C4::XSLT::BEGIN@35 at line 16
use XML::LibXML 1.70;
# spent 498µs making 1 call to XML::LibXSLT::BEGIN@16 # spent 380µs making 1 call to XML::LibXML::import # spent 92µs making 1 call to XML::LibXML::VERSION
17352µs236µs
# spent 29µs (23+6) within XML::LibXSLT::BEGIN@17 which was called: # once (23µs+6µs) by C4::XSLT::BEGIN@35 at line 17
use XML::LibXML::Literal;
# spent 29µs making 1 call to XML::LibXSLT::BEGIN@17 # spent 6µs making 1 call to UNIVERSAL::import
18350µs228µs
# spent 25µs (22+3) within XML::LibXSLT::BEGIN@18 which was called: # once (22µs+3µs) by C4::XSLT::BEGIN@35 at line 18
use XML::LibXML::Boolean;
# spent 25µs making 1 call to XML::LibXSLT::BEGIN@18 # spent 3µs making 1 call to UNIVERSAL::import
19350µs227µs
# spent 24µs (21+3) within XML::LibXSLT::BEGIN@19 which was called: # once (21µs+3µs) by C4::XSLT::BEGIN@35 at line 19
use XML::LibXML::Number;
# spent 24µs making 1 call to XML::LibXSLT::BEGIN@19 # spent 3µs making 1 call to UNIVERSAL::import
20368µs229µs
# spent 26µs (22+3) within XML::LibXSLT::BEGIN@20 which was called: # once (22µs+3µs) by C4::XSLT::BEGIN@35 at line 20
use XML::LibXML::NodeList;
# spent 26µs making 1 call to XML::LibXSLT::BEGIN@20 # spent 3µs making 1 call to UNIVERSAL::import
21
22
23
# spent 909µs (101+808) within XML::LibXSLT::BEGIN@23 which was called: # once (101µs+808µs) by C4::XSLT::BEGIN@35 at line 44
BEGIN {
243215µs2181µs
# spent 102µs (23+79) within XML::LibXSLT::BEGIN@24 which was called: # once (23µs+79µs) by C4::XSLT::BEGIN@35 at line 24
use Carp;
# spent 102µs making 1 call to XML::LibXSLT::BEGIN@24 # spent 79µs making 1 call to Exporter::import
25
2612µsrequire Exporter;
27
2811µs$VERSION = "1.70";
29
3011µsrequire DynaLoader;
31
32115µs@ISA = qw(DynaLoader);
33
34# avoid possible shared library name conflict on Win32
35# not using this trick on 5.10.0 (suffering from DynaLoader bug)
3612µslocal $DynaLoader::dl_dlext = "xs.$DynaLoader::dl_dlext" if (($^O eq 'MSWin32') && ($] ne '5.010000'));
37
3819µs1803µsbootstrap XML::LibXSLT $VERSION;
# spent 803µs making 1 call to DynaLoader::bootstrap
39
40# the following magic lets XML::LibXSLT internals know
41# where to register XML::LibXML proxy nodes
4216µs16µsINIT_THREAD_SUPPORT() if XML::LibXML::threads_shared_enabled();
# spent 6µs making 1 call to XML::LibXML::threads_shared_enabled
4316µs$USE_LIBXML_DATA_TYPES = 0;
441364µs1909µs}
# spent 909µs making 1 call to XML::LibXSLT::BEGIN@23
45
46
47
# spent 27µs within XML::LibXSLT::new which was called: # once (27µs+0s) by C4::XSLT::XSLTParse4Display at line 229 of /usr/share/koha/lib/C4/XSLT.pm
sub new {
4812µs my $class = shift;
4912µs my %options = @_;
50117µs my $self = bless \%options, $class;
51110µs return $self;
52}
53
54# ido - perl dispatcher
55sub perl_dispatcher {
56 my $func = shift;
57 my @params = @_;
58 my @perlParams;
59
60 my $i = 0;
61 while (@params) {
62 my $type = shift(@params);
63 if ($type eq 'XML::LibXML::Literal' or
64 $type eq 'XML::LibXML::Number' or
65 $type eq 'XML::LibXML::Boolean')
66 {
67 my $val = shift(@params);
68 unshift(@perlParams, $USE_LIBXML_DATA_TYPES ? $type->new($val) : $val);
69 }
70 elsif ($type eq 'XML::LibXML::NodeList') {
71 my $node_count = shift(@params);
72 my @nodes = splice(@params, 0, $node_count);
73 # warn($_->getName) for @nodes;
74 unshift(@perlParams, $type->new(@nodes));
75 }
76 }
77
78 $func = "main::$func" unless ref($func) || $func =~ /(.+)::/;
7931.75ms293µs
# spent 57µs (21+36) within XML::LibXSLT::BEGIN@79 which was called: # once (21µs+36µs) by C4::XSLT::BEGIN@35 at line 79
no strict 'refs';
# spent 57µs making 1 call to XML::LibXSLT::BEGIN@79 # spent 36µs making 1 call to strict::unimport
80 my $res = $func->(@perlParams);
81 return $res;
82}
83
84
85sub xpath_to_string {
86 my @results;
87 while (@_) {
88 my $value = shift(@_); $value = '' unless defined $value;
89 push @results, $value;
90 if (@results % 2) {
91 # key
92 $results[-1] =~ s/:/_/g; # XSLT doesn't like names with colons
93 }
94 else {
95 if ($value =~ s/'/', "'", '/g) {
96 $results[-1] = "concat('$value')";
97 }
98 else {
99 $results[-1] = "'$results[-1]'";
100 }
101 }
102 }
103 return @results;
104}
105
106#-------------------------------------------------------------------------#
107# callback functions #
108#-------------------------------------------------------------------------#
109
110sub security_callbacks {
111 my $self = shift;
112 my $scbclass = shift;
113
114 if ( defined $scbclass ) {
115 $self->{XML_LIBXSLT_SECPREFS} = $scbclass;
116 }
117 return $self->{XML_LIBXSLT_SECPREFS};
118}
119
120sub input_callbacks {
121 my $self = shift;
122 my $icbclass = shift;
123
124 if ( defined $icbclass ) {
125 $self->{XML_LIBXSLT_CALLBACK_STACK} = $icbclass;
126 }
127 return $self->{XML_LIBXSLT_CALLBACK_STACK};
128}
129
130
# spent 12µs within XML::LibXSLT::match_callback which was called 2 times, avg 6µs/call: # once (7µs+0s) by XML::LibXSLT::_cleanup_callbacks at line 237 # once (5µs+0s) by XML::LibXSLT::_init_callbacks at line 221
sub match_callback {
13122µs my $self = shift;
13222µs if ( ref $self ) {
13321µs if ( scalar @_ ) {
134 $self->{XML_LIBXSLT_MATCH_CB} = shift;
135 $self->{XML_LIBXSLT_CALLBACK_STACK} = undef;
136 }
137210µs return $self->{XML_LIBXSLT_MATCH_CB};
138 }
139 else {
140 $MatchCB = shift if scalar @_;
141 return $MatchCB;
142 }
143}
144
145
# spent 5µs within XML::LibXSLT::read_callback which was called: # once (5µs+0s) by XML::LibXSLT::_init_callbacks at line 223
sub read_callback {
1461700ns my $self = shift;
14711µs if ( ref $self ) {
1481600ns if ( scalar @_ ) {
149 $self->{XML_LIBXSLT_READ_CB} = shift;
150 $self->{XML_LIBXSLT_CALLBACK_STACK} = undef;
151 }
15214µs return $self->{XML_LIBXSLT_READ_CB};
153 }
154 else {
155 $ReadCB = shift if scalar @_;
156 return $ReadCB;
157 }
158}
159
160
# spent 4µs within XML::LibXSLT::close_callback which was called: # once (4µs+0s) by XML::LibXSLT::_init_callbacks at line 224
sub close_callback {
1611500ns my $self = shift;
1621900ns if ( ref $self ) {
1631600ns if ( scalar @_ ) {
164 $self->{XML_LIBXSLT_CLOSE_CB} = shift;
165 $self->{XML_LIBXSLT_CALLBACK_STACK} = undef;
166 }
16717µs return $self->{XML_LIBXSLT_CLOSE_CB};
168 }
169 else {
170 $CloseCB = shift if scalar @_;
171 return $CloseCB;
172 }
173}
174
175
# spent 5µs within XML::LibXSLT::open_callback which was called: # once (5µs+0s) by XML::LibXSLT::_init_callbacks at line 222
sub open_callback {
1761600ns my $self = shift;
1771800ns if ( ref $self ) {
1781600ns if ( scalar @_ ) {
179 $self->{XML_LIBXSLT_OPEN_CB} = shift;
180 $self->{XML_LIBXSLT_CALLBACK_STACK} = undef;
181 }
18216µs return $self->{XML_LIBXSLT_OPEN_CB};
183 }
184 else {
185 $OpenCB = shift if scalar @_;
186 return $OpenCB;
187 }
188}
189
190sub callbacks {
191 my $self = shift;
192 if ( ref $self ) {
193 if (@_) {
194 my ($match, $open, $read, $close) = @_;
195 @{$self}{qw(XML_LIBXSLT_MATCH_CB XML_LIBXSLT_OPEN_CB XML_LIBXSLT_READ_CB XML_LIBXSLT_CLOSE_CB)} = ($match, $open, $read, $close);
196 $self->{XML_LIBXSLT_CALLBACK_STACK} = undef;
197 }
198 else {
199 return @{$self}{qw(XML_LIBXSLT_MATCH_CB XML_LIBXSLT_OPEN_CB XML_LIBXSLT_READ_CB XML_LIBXSLT_CLOSE_CB)};
200 }
201 }
202 else {
203 if (@_) {
204 ( $MatchCB, $OpenCB, $ReadCB, $CloseCB ) = @_;
205 }
206 else {
207 return ( $MatchCB, $OpenCB, $ReadCB, $CloseCB );
208 }
209 }
210}
211
212
# spent 120µs (61+60) within XML::LibXSLT::_init_callbacks which was called: # once (61µs+60µs) by XML::LibXSLT::parse_stylesheet at line 246
sub _init_callbacks{
2131600ns my $self = shift;
21411µs my $icb = $self->{XML_LIBXSLT_CALLBACK_STACK};
215
2161700ns unless ( defined $icb ) {
21714µs15µs $self->{XML_LIBXSLT_CALLBACK_STACK} = XML::LibXML::InputCallback->new();
# spent 5µs making 1 call to XML::LibXML::InputCallback::new
2181900ns $icb = $self->{XML_LIBXSLT_CALLBACK_STACK};
219 }
220
22114µs15µs my $mcb = $self->match_callback();
# spent 5µs making 1 call to XML::LibXSLT::match_callback
22214µs15µs my $ocb = $self->open_callback();
# spent 5µs making 1 call to XML::LibXSLT::open_callback
22314µs15µs my $rcb = $self->read_callback();
# spent 5µs making 1 call to XML::LibXSLT::read_callback
22414µs14µs my $ccb = $self->close_callback();
# spent 4µs making 1 call to XML::LibXSLT::close_callback
225
22611µs if ( defined $mcb and defined $ocb and defined $rcb and defined $ccb ) {
227 $icb->register_callbacks( [$mcb, $ocb, $rcb, $ccb] );
228 }
229
230132µs120µs $self->lib_init_callbacks();
# spent 20µs making 1 call to XML::LibXSLT::lib_init_callbacks
231113µs116µs $icb->init_callbacks();
# spent 16µs making 1 call to XML::LibXML::InputCallback::init_callbacks
232}
233
234
# spent 37µs (16+21) within XML::LibXSLT::_cleanup_callbacks which was called: # once (16µs+21µs) by XML::LibXSLT::parse_stylesheet at line 251
sub _cleanup_callbacks {
23511µs my $self = shift;
23614µs114µs $self->{XML_LIBXSLT_CALLBACK_STACK}->cleanup_callbacks();
# spent 14µs making 1 call to XML::LibXML::InputCallback::cleanup_callbacks
23714µs17µs my $mcb = $self->match_callback();
# spent 7µs making 1 call to XML::LibXSLT::match_callback
23814µs if ( defined $mcb ) {
239 $self->{XML_LIBXSLT_CALLBACK_STACK}->unregister_callbacks( [$mcb] );
240 }
241}
242
243
# spent 10.3ms (63µs+10.3) within XML::LibXSLT::parse_stylesheet which was called: # once (63µs+10.3ms) by C4::XSLT::XSLTParse4Display at line 238 of /usr/share/koha/lib/C4/XSLT.pm
sub parse_stylesheet {
2441700ns my $self = shift;
245
24614µs1120µs $self->_init_callbacks();
# spent 120µs making 1 call to XML::LibXSLT::_init_callbacks
247
2481500ns my $stylesheet;
249210.1ms310.1ms eval { $stylesheet = $self->_parse_stylesheet(@_); };
# spent 10.1ms making 1 call to XML::LibXSLT::_parse_stylesheet # spent 26µs making 2 calls to XML::LibXML::InputCallback::_callback_match, avg 13µs/call
250
25115µs137µs $self->_cleanup_callbacks();
# spent 37µs making 1 call to XML::LibXSLT::_cleanup_callbacks
252
2531900ns my $err = $@;
2541400ns if ($err) {
255 croak $err;
256 }
257
25819µs my $rv = {
259 XML_LIBXSLT_STYLESHEET => $stylesheet,
260 XML_LIBXSLT_CALLBACK_STACK => $self->{XML_LIBXSLT_CALLBACK_STACK},
261 XML_LIBXSLT_MATCH_CB => $self->{XML_LIBXSLT_MATCH_CB},
262 XML_LIBXSLT_OPEN_CB => $self->{XML_LIBXSLT_OPEN_CB},
263 XML_LIBXSLT_READ_CB => $self->{XML_LIBXSLT_READ_CB},
264 XML_LIBXSLT_CLOSE_CB => $self->{XML_LIBXSLT_CLOSE_CB},
265 XML_LIBXSLT_SECPREFS => $self->{XML_LIBXSLT_SECPREFS},
266 };
267
268119µs return bless $rv, "XML::LibXSLT::StylesheetWrapper";
269}
270
271sub parse_stylesheet_file {
272 my $self = shift;
273
274 $self->_init_callbacks();
275
276 my $stylesheet;
277 eval { $stylesheet = $self->_parse_stylesheet_file(@_); };
278
279 $self->_cleanup_callbacks();
280
281 my $err = $@;
282 if ($err) {
283 croak $err;
284 }
285
286 my $rv = {
287 XML_LIBXSLT_STYLESHEET => $stylesheet,
288 XML_LIBXSLT_CALLBACK_STACK => $self->{XML_LIBXSLT_CALLBACK_STACK},
289 XML_LIBXSLT_MATCH_CB => $self->{XML_LIBXSLT_MATCH_CB},
290 XML_LIBXSLT_OPEN_CB => $self->{XML_LIBXSLT_OPEN_CB},
291 XML_LIBXSLT_READ_CB => $self->{XML_LIBXSLT_READ_CB},
292 XML_LIBXSLT_CLOSE_CB => $self->{XML_LIBXSLT_CLOSE_CB},
293 XML_LIBXSLT_SECPREFS => $self->{XML_LIBXSLT_SECPREFS},
294 };
295
296 return bless $rv, "XML::LibXSLT::StylesheetWrapper";
297}
298
299sub register_xslt_module {
300 my $self = shift;
301 my $module = shift;
302 # Not implemented
303}
304
3051300ns1;
306
307package XML::LibXSLT::StylesheetWrapper;
308
309353µs234µs
# spent 27µs (21+6) within XML::LibXSLT::StylesheetWrapper::BEGIN@309 which was called: # once (21µs+6µs) by C4::XSLT::BEGIN@35 at line 309
use strict;
# spent 27µs making 1 call to XML::LibXSLT::StylesheetWrapper::BEGIN@309 # spent 6µs making 1 call to strict::import
310383µs2270µs
# spent 152µs (34+118) within XML::LibXSLT::StylesheetWrapper::BEGIN@310 which was called: # once (34µs+118µs) by C4::XSLT::BEGIN@35 at line 310
use vars qw($MatchCB $ReadCB $OpenCB $CloseCB);
# spent 152µs making 1 call to XML::LibXSLT::StylesheetWrapper::BEGIN@310 # spent 118µs making 1 call to vars::import
311
312362µs2914µs
# spent 466µs (18+448) within XML::LibXSLT::StylesheetWrapper::BEGIN@312 which was called: # once (18µs+448µs) by C4::XSLT::BEGIN@35 at line 312
use XML::LibXML;
# spent 466µs making 1 call to XML::LibXSLT::StylesheetWrapper::BEGIN@312 # spent 448µs making 1 call to XML::LibXML::import
31331.95ms2203µs
# spent 113µs (23+90) within XML::LibXSLT::StylesheetWrapper::BEGIN@313 which was called: # once (23µs+90µs) by C4::XSLT::BEGIN@35 at line 313
use Carp;
# spent 113µs making 1 call to XML::LibXSLT::StylesheetWrapper::BEGIN@313 # spent 90µs making 1 call to Exporter::import
314
315sub security_callbacks {
316 my $self = shift;
317 my $scbclass = shift;
318
319 if ( defined $scbclass ) {
320 $self->{XML_LIBXSLT_SECPREFS} = $scbclass;
321 }
322 return $self->{XML_LIBXSLT_SECPREFS};
323}
324
325sub input_callbacks {
326 my $self = shift;
327 my $icbclass = shift;
328
329 if ( defined $icbclass ) {
330 $self->{XML_LIBXSLT_CALLBACK_STACK} = $icbclass;
331 }
332 return $self->{XML_LIBXSLT_CALLBACK_STACK};
333}
334
335
# spent 278µs within XML::LibXSLT::StylesheetWrapper::match_callback which was called 50 times, avg 6µs/call: # 25 times (139µs+0s) by XML::LibXSLT::StylesheetWrapper::_init_callbacks at line 426, avg 6µs/call # 25 times (138µs+0s) by XML::LibXSLT::StylesheetWrapper::_cleanup_callbacks at line 446, avg 6µs/call
sub match_callback {
3365035µs my $self = shift;
3375054µs if ( ref $self ) {
3385028µs if ( scalar @_ ) {
339 $self->{XML_LIBXSLT_MATCH_CB} = shift;
340 $self->{XML_LIBXSLT_CALLBACK_STACK} = undef;
341 }
34250249µs return $self->{XML_LIBXSLT_MATCH_CB};
343 }
344 else {
345 $MatchCB = shift if scalar @_;
346 return $MatchCB;
347 }
348}
349
350
# spent 152µs within XML::LibXSLT::StylesheetWrapper::read_callback which was called 25 times, avg 6µs/call: # 25 times (152µs+0s) by XML::LibXSLT::StylesheetWrapper::_init_callbacks at line 428, avg 6µs/call
sub read_callback {
3512522µs my $self = shift;
3522528µs if ( ref $self ) {
3532519µs if ( scalar @_ ) {
354 $self->{XML_LIBXSLT_READ_CB} = shift;
355 $self->{XML_LIBXSLT_CALLBACK_STACK} = undef;
356 }
35725153µs return $self->{XML_LIBXSLT_READ_CB};
358 }
359 else {
360 $ReadCB = shift if scalar @_;
361 return $ReadCB;
362 }
363}
364
365
# spent 127µs within XML::LibXSLT::StylesheetWrapper::close_callback which was called 25 times, avg 5µs/call: # 25 times (127µs+0s) by XML::LibXSLT::StylesheetWrapper::_init_callbacks at line 429, avg 5µs/call
sub close_callback {
3662517µs my $self = shift;
3672521µs if ( ref $self ) {
3682514µs if ( scalar @_ ) {
369 $self->{XML_LIBXSLT_CLOSE_CB} = shift;
370 $self->{XML_LIBXSLT_CALLBACK_STACK} = undef;
371 }
37225108µs return $self->{XML_LIBXSLT_CLOSE_CB};
373 }
374 else {
375 $CloseCB = shift if scalar @_;
376 return $CloseCB;
377 }
378}
379
380
# spent 151µs within XML::LibXSLT::StylesheetWrapper::open_callback which was called 25 times, avg 6µs/call: # 25 times (151µs+0s) by XML::LibXSLT::StylesheetWrapper::_init_callbacks at line 427, avg 6µs/call
sub open_callback {
3812519µs my $self = shift;
3822525µs if ( ref $self ) {
3832518µs if ( scalar @_ ) {
384 $self->{XML_LIBXSLT_OPEN_CB} = shift;
385 $self->{XML_LIBXSLT_CALLBACK_STACK} = undef;
386 }
38725126µs return $self->{XML_LIBXSLT_OPEN_CB};
388 }
389 else {
390 $OpenCB = shift if scalar @_;
391 return $OpenCB;
392 }
393}
394
395sub callbacks {
396 my $self = shift;
397 if ( ref $self ) {
398 if (@_) {
399 my ($match, $open, $read, $close) = @_;
400 @{$self}{qw(XML_LIBXSLT_MATCH_CB XML_LIBXSLT_OPEN_CB XML_LIBXSLT_READ_CB XML_LIBXSLT_CLOSE_CB)} = ($match, $open, $read, $close);
401 $self->{XML_LIBXSLT_CALLBACK_STACK} = undef;
402 }
403 else {
404 return @{$self}{qw(XML_LIBXSLT_MATCH_CB XML_LIBXSLT_OPEN_CB XML_LIBXSLT_READ_CB XML_LIBXSLT_CLOSE_CB)};
405 }
406 }
407 else {
408 if (@_) {
409 ( $MatchCB, $OpenCB, $ReadCB, $CloseCB ) = @_;
410 }
411 else {
412 return ( $MatchCB, $OpenCB, $ReadCB, $CloseCB );
413 }
414 }
415}
416
417
# spent 2.01ms (1.12+894µs) within XML::LibXSLT::StylesheetWrapper::_init_callbacks which was called 25 times, avg 80µs/call: # 25 times (1.12ms+894µs) by XML::LibXSLT::StylesheetWrapper::transform at line 461, avg 80µs/call
sub _init_callbacks {
4182517µs my $self = shift;
4192540µs my $icb = $self->{XML_LIBXSLT_CALLBACK_STACK};
420
4212514µs unless ( defined $icb ) {
422 $self->{XML_LIBXSLT_CALLBACK_STACK} = XML::LibXML::InputCallback->new();
423 $icb = $self->{XML_LIBXSLT_CALLBACK_STACK};
424 }
425
4262598µs25139µs my $mcb = $self->match_callback();
# spent 139µs making 25 calls to XML::LibXSLT::StylesheetWrapper::match_callback, avg 6µs/call
42725108µs25151µs my $ocb = $self->open_callback();
# spent 151µs making 25 calls to XML::LibXSLT::StylesheetWrapper::open_callback, avg 6µs/call
42825120µs25152µs my $rcb = $self->read_callback();
# spent 152µs making 25 calls to XML::LibXSLT::StylesheetWrapper::read_callback, avg 6µs/call
4292591µs25127µs my $ccb = $self->close_callback();
# spent 127µs making 25 calls to XML::LibXSLT::StylesheetWrapper::close_callback, avg 5µs/call
430
4312522µs if ( defined $mcb and defined $ocb and defined $rcb and defined $ccb ) {
432 $icb->register_callbacks( [$mcb, $ocb, $rcb, $ccb] );
433 }
43425310µs2593µs $self->XML::LibXSLT::lib_init_callbacks();
# spent 93µs making 25 calls to XML::LibXSLT::lib_init_callbacks, avg 4µs/call
4352565µs25232µs $icb->init_callbacks();
# spent 232µs making 25 calls to XML::LibXML::InputCallback::init_callbacks, avg 9µs/call
436
4372530µs my $scb = $self->{XML_LIBXSLT_SECPREFS};
43825104µs if ( $scb ) {
439 $scb->init_callbacks();
440 }
441}
442
443
# spent 924µs (467+457) within XML::LibXSLT::StylesheetWrapper::_cleanup_callbacks which was called 25 times, avg 37µs/call: # 25 times (467µs+457µs) by XML::LibXSLT::StylesheetWrapper::transform at line 463, avg 37µs/call
sub _cleanup_callbacks {
4442538µs my $self = shift;
44525115µs25318µs $self->{XML_LIBXSLT_CALLBACK_STACK}->cleanup_callbacks();
# spent 318µs making 25 calls to XML::LibXML::InputCallback::cleanup_callbacks, avg 13µs/call
4462579µs25138µs my $mcb = $self->match_callback();
# spent 138µs making 25 calls to XML::LibXSLT::StylesheetWrapper::match_callback, avg 6µs/call
4472523µs if ( defined $mcb ) {
448 $self->{XML_LIBXSLT_CALLBACK_STACK}->unregister_callbacks( [$mcb] );
449 }
450
4512530µs my $scb = $self->{XML_LIBXSLT_SECPREFS};
45225164µs if ( $scb ) {
453 $scb->cleanup_callbacks();
454 }
455}
456
457
# spent 47.5ms (915µs+46.6) within XML::LibXSLT::StylesheetWrapper::transform which was called 25 times, avg 1.90ms/call: # 25 times (915µs+46.6ms) by C4::XSLT::XSLTParse4Display at line 240 of /usr/share/koha/lib/C4/XSLT.pm, avg 1.90ms/call
sub transform {
4582516µs my $self = shift;
4592512µs my $doc;
460
4612599µs252.01ms $self->_init_callbacks();
# spent 2.01ms making 25 calls to XML::LibXSLT::StylesheetWrapper::_init_callbacks, avg 80µs/call
4625044.0ms2543.7ms eval { $doc = $self->{XML_LIBXSLT_STYLESHEET}->transform($self,@_); };
# spent 43.7ms making 25 calls to XML::LibXSLT::Stylesheet::transform, avg 1.75ms/call
46325150µs25924µs $self->_cleanup_callbacks();
# spent 924µs making 25 calls to XML::LibXSLT::StylesheetWrapper::_cleanup_callbacks, avg 37µs/call
464
4652531µs my $err = $@;
4662512µs if ($err) {
467 croak $err;
468 }
469
47025158µs return $doc;
471}
472
473sub transform_file {
474 my $self = shift;
475 my $doc;
476
477 $self->_init_callbacks();
478 eval { $doc = $self->{XML_LIBXSLT_STYLESHEET}->transform_file($self,@_); };
479 $self->_cleanup_callbacks();
480
481 my $err = $@;
482 if ($err) {
483 croak $err;
484 }
485
486 return $doc;
487}
488
489251.82ms251.55ms
# spent 1.79ms (248µs+1.55) within XML::LibXSLT::StylesheetWrapper::output_string which was called 25 times, avg 72µs/call: # 25 times (248µs+1.55ms) by C4::XSLT::XSLTParse4Display at line 241 of /usr/share/koha/lib/C4/XSLT.pm, avg 72µs/call
sub output_string { shift->{XML_LIBXSLT_STYLESHEET}->_output_string($_[0],0) }
# spent 1.55ms making 25 calls to XML::LibXSLT::Stylesheet::_output_string, avg 62µs/call
490sub output_as_bytes { shift->{XML_LIBXSLT_STYLESHEET}->_output_string($_[0],1) }
491sub output_as_chars { shift->{XML_LIBXSLT_STYLESHEET}->_output_string($_[0],2) }
492sub output_fh { shift->{XML_LIBXSLT_STYLESHEET}->output_fh(@_) }
493sub output_file { shift->{XML_LIBXSLT_STYLESHEET}->output_file(@_) }
494sub media_type { shift->{XML_LIBXSLT_STYLESHEET}->media_type(@_) }
495sub output_encoding { shift->{XML_LIBXSLT_STYLESHEET}->output_encoding(@_) }
496
4971200ns1;
498
499# XML::LibXSLT::Security Interface #
500#-------------------------------------------------------------------------#
501package XML::LibXSLT::Security;
502
503360µs241µs
# spent 34µs (26+8) within XML::LibXSLT::Security::BEGIN@503 which was called: # once (26µs+8µs) by C4::XSLT::BEGIN@35 at line 503
use strict;
# spent 34µs making 1 call to XML::LibXSLT::Security::BEGIN@503 # spent 8µs making 1 call to strict::import
504358µs2203µs
# spent 112µs (21+91) within XML::LibXSLT::Security::BEGIN@504 which was called: # once (21µs+91µs) by C4::XSLT::BEGIN@35 at line 504
use Carp;
# spent 112µs making 1 call to XML::LibXSLT::Security::BEGIN@504 # spent 91µs making 1 call to Exporter::import
505
5063636µs2179µs
# spent 99µs (18+81) within XML::LibXSLT::Security::BEGIN@506 which was called: # once (18µs+81µs) by C4::XSLT::BEGIN@35 at line 506
use vars qw(%OPTION_MAP %_GLOBAL_CALLBACKS);
# spent 99µs making 1 call to XML::LibXSLT::Security::BEGIN@506 # spent 81µs making 1 call to vars::import
507
508# Maps the option names used in the perl interface to the numeric values
509# used by libxslt.
51018µsmy %OPTION_MAP = (
511 read_file => 1,
512 write_file => 2,
513 create_dir => 3,
514 read_net => 4,
515 write_net => 5,
516);
517
5181700ns%_GLOBAL_CALLBACKS = ();
519
520
521#-------------------------------------------------------------------------#
522# global callback #
523#-------------------------------------------------------------------------#
524sub _security_check {
525 my $option = shift;
526 my $retval = 1;
527
528 if ($option == 3) {
529 $retval = 0; # Default create_dir to no access
530 }
531
532 if (exists $_GLOBAL_CALLBACKS{$option}) {
533 $retval = $_GLOBAL_CALLBACKS{$option}->(@_);
534 }
535
536 return $retval;
537}
538
539#-------------------------------------------------------------------------#
540# member functions and methods #
541#-------------------------------------------------------------------------#
542
543sub new {
544 my $class = shift;
545 return bless {'_CALLBACKS' => {}}, $class;
546}
547
548# Add a callback for the given security option (read_file, write_file,
549# create_dir, read_net, write_net).
550#
551# To register a callback that handle network read requests:
552# $scb->register_callback( read_net => \&callback );
553sub register_callback {
554 my $self = shift;
555 my $option = shift;
556 my $callback = shift;
557
558 unless ( exists $OPTION_MAP{$option} ) {
559 croak "Invalid security option '$option'. Must be one of: " .
560 join(', ', keys %OPTION_MAP) . ".";
561 }
562
563 if ( ref $callback eq 'CODE' ) {
564 $self->{_CALLBACKS}{ $OPTION_MAP{$option} } = $callback;
565 }
566 else {
567 croak "Invalid argument. The callback must be a reference to a subroutine";
568 }
569}
570
571# Removes the callback for the given security option. Causes the given option
572# to use the default security handler (which always allows the action).
573sub unregister_callback {
574 my $self = shift;
575 my $option = shift;
576
577 unless ( exists $OPTION_MAP{$option} ) {
578 croak "Invalid security option '$option'. Must be one of: " .
579 join(', ', keys %OPTION_MAP) . ".";
580 }
581
582 delete $self->{_CALLBACKS}{ $OPTION_MAP{$option} };
583}
584
585
586# make it so libxslt can use the callbacks
587sub init_callbacks {
588 my $self = shift;
589
590 %_GLOBAL_CALLBACKS = %{ $self->{_CALLBACKS} };
591}
592
593# reset libxslt callbacks
594sub cleanup_callbacks {
595 my $self = shift;
596
597 %_GLOBAL_CALLBACKS = ();
598}
599
600110µs1;
601
602__END__
 
# spent 10.1ms (10.1+26µs) within XML::LibXSLT::_parse_stylesheet which was called: # once (10.1ms+26µs) by XML::LibXSLT::parse_stylesheet at line 249
sub XML::LibXSLT::_parse_stylesheet; # xsub
# spent 261µs within XML::LibXSLT::bootstrap which was called: # once (261µs+0s) by DynaLoader::bootstrap at line 215 of DynaLoader.pm
sub XML::LibXSLT::bootstrap; # xsub
# spent 112µs within XML::LibXSLT::lib_init_callbacks which was called 26 times, avg 4µs/call: # 25 times (93µs+0s) by XML::LibXSLT::StylesheetWrapper::_init_callbacks at line 434, avg 4µs/call # once (20µs+0s) by XML::LibXSLT::_init_callbacks at line 230
sub XML::LibXSLT::lib_init_callbacks; # xsub