← Index
NYTProf Performance Profile   « line view »
For starman worker -M FindBin --max-requests 50 --workers 2 --user=kohadev-koha --group kohadev-koha --pid /var/run/koha/kohadev/plack.pid --daemonize --access-log /var/log/koha/kohadev/plack.log --error-log /var/log/koha/kohadev/plack-error.log -E deployment --socket /var/run/koha/kohadev/plack.sock /etc/koha/sites/kohadev/plack.psgi
  Run on Fri Jan 8 14:16:49 2016
Reported on Fri Jan 8 14:23:06 2016

Filename/usr/lib/x86_64-linux-gnu/perl5/5.20/Template/Document.pm
StatementsExecuted 0 statements in 0s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
11114µs22µsTemplate::Document::::BEGIN@24Template::Document::BEGIN@24
1119µs25µsTemplate::Document::::BEGIN@27Template::Document::BEGIN@27
1118µs45µsTemplate::Document::::BEGIN@26Template::Document::BEGIN@26
1118µs8µsTemplate::Document::::BEGIN@34Template::Document::BEGIN@34
1117µs12µsTemplate::Document::::BEGIN@25Template::Document::BEGIN@25
0000s0sTemplate::Document::::AUTOLOADTemplate::Document::AUTOLOAD
0000s0sTemplate::Document::::_dumpTemplate::Document::_dump
0000s0sTemplate::Document::::as_perlTemplate::Document::as_perl
0000s0sTemplate::Document::::blockTemplate::Document::block
0000s0sTemplate::Document::::blocksTemplate::Document::blocks
0000s0sTemplate::Document::::catch_warningsTemplate::Document::catch_warnings
0000s0sTemplate::Document::::newTemplate::Document::new
0000s0sTemplate::Document::::processTemplate::Document::process
0000s0sTemplate::Document::::variablesTemplate::Document::variables
0000s0sTemplate::Document::::write_perl_fileTemplate::Document::write_perl_file
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1##============================================================= -*-Perl-*-
2#
3# Template::Document
4#
5# DESCRIPTION
6# Module defining a class of objects which encapsulate compiled
7# templates, storing additional block definitions and metadata
8# as well as the compiled Perl sub-routine representing the main
9# template content.
10#
11# AUTHOR
12# Andy Wardley <abw@wardley.org>
13#
14# COPYRIGHT
15# Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.
16#
17# This module is free software; you can redistribute it and/or
18# modify it under the same terms as Perl itself.
19#
20#============================================================================
21
22package Template::Document;
23
24229µs
# spent 22µs (14+7) within Template::Document::BEGIN@24 which was called: # once (14µs+7µs) by Template::Provider::BEGIN@46 at line 24
use strict;
# spent 22µs making 1 call to Template::Document::BEGIN@24 # spent 7µs making 1 call to strict::import
25216µs
# spent 12µs (7+4) within Template::Document::BEGIN@25 which was called: # once (7µs+4µs) by Template::Provider::BEGIN@46 at line 25
use warnings;
# spent 12µs making 1 call to Template::Document::BEGIN@25 # spent 4µs making 1 call to warnings::import
26281µs
# spent 45µs (8+37) within Template::Document::BEGIN@26 which was called: # once (8µs+37µs) by Template::Provider::BEGIN@46 at line 26
use base 'Template::Base';
# spent 45µs making 1 call to Template::Document::BEGIN@26 # spent 37µs making 1 call to base::import
27242µs
# spent 25µs (9+16) within Template::Document::BEGIN@27 which was called: # once (9µs+16µs) by Template::Provider::BEGIN@46 at line 27
use Template::Constants;
# spent 25µs making 1 call to Template::Document::BEGIN@27 # spent 16µs making 1 call to Exporter::import
28
29our $VERSION = 2.79;
30our $DEBUG = 0 unless defined $DEBUG;
31our $ERROR = '';
32our ($COMPERR, $AUTOLOAD, $UNICODE);
33
34
# spent 8µs within Template::Document::BEGIN@34 which was called: # once (8µs+0s) by Template::Provider::BEGIN@46 at line 47
BEGIN {
35 # UNICODE is supported in versions of Perl from 5.008 onwards
36 if ($UNICODE = $] > 5.007 ? 1 : 0) {
37 if ($] > 5.008) {
38 # utf8::is_utf8() available from Perl 5.8.1 onwards
39 *is_utf8 = \&utf8::is_utf8;
40 }
41 elsif ($] == 5.008) {
42 # use Encode::is_utf8() for Perl 5.8.0
43 require Encode;
44 *is_utf8 = \&Encode::is_utf8;
45 }
46 }
4718µs}
# spent 8µs making 1 call to Template::Document::BEGIN@34
48
49
50#========================================================================
51# ----- PUBLIC METHODS -----
52#========================================================================
53
54#------------------------------------------------------------------------
55# new(\%document)
56#
57# Creates a new self-contained Template::Document object which
58# encapsulates a compiled Perl sub-routine, $block, any additional
59# BLOCKs defined within the document ($defblocks, also Perl sub-routines)
60# and additional $metadata about the document.
61#------------------------------------------------------------------------
62
63sub new {
64 my ($class, $doc) = @_;
65 my ($block, $defblocks, $variables, $metadata) = @$doc{ qw( BLOCK DEFBLOCKS VARIABLES METADATA ) };
66 $defblocks ||= { };
67 $metadata ||= { };
68
69 # evaluate Perl code in $block to create sub-routine reference if necessary
70 unless (ref $block) {
71 local $SIG{__WARN__} = \&catch_warnings;
72 $COMPERR = '';
73
74 # DON'T LOOK NOW! - blindly untainting can make you go blind!
75 $block =~ /(.*)/s;
76 $block = $1;
77
78 $block = eval $block;
79 return $class->error($@)
80 unless defined $block;
81 }
82
83 # same for any additional BLOCK definitions
84 @$defblocks{ keys %$defblocks } =
85 # MORE BLIND UNTAINTING - turn away if you're squeamish
86 map {
87 ref($_)
88 ? $_
89 : ( /(.*)/s && eval($1) or return $class->error($@) )
90 } values %$defblocks;
91
92 bless {
93 %$metadata,
94 _BLOCK => $block,
95 _DEFBLOCKS => $defblocks,
96 _VARIABLES => $variables,
97 _HOT => 0,
98 }, $class;
99}
100
101
102#------------------------------------------------------------------------
103# block()
104#
105# Returns a reference to the internal sub-routine reference, _BLOCK,
106# that constitutes the main document template.
107#------------------------------------------------------------------------
108
109sub block {
110 return $_[0]->{ _BLOCK };
111}
112
113
114#------------------------------------------------------------------------
115# blocks()
116#
117# Returns a reference to a hash array containing any BLOCK definitions
118# from the template. The hash keys are the BLOCK nameand the values
119# are references to Template::Document objects. Returns 0 (# an empty hash)
120# if no blocks are defined.
121#------------------------------------------------------------------------
122
123sub blocks {
124 return $_[0]->{ _DEFBLOCKS };
125}
126
127
128#-----------------------------------------------------------------------
129# variables()
130#
131# Returns a reference to a hash of variables used in the template.
132# This requires the TRACE_VARS option to be enabled.
133#-----------------------------------------------------------------------
134
135sub variables {
136 return $_[0]->{ _VARIABLES };
137}
138
139#------------------------------------------------------------------------
140# process($context)
141#
142# Process the document in a particular context. Checks for recursion,
143# registers the document with the context via visit(), processes itself,
144# and then unwinds with a large gin and tonic.
145#------------------------------------------------------------------------
146
147sub process {
148 my ($self, $context) = @_;
149 my $defblocks = $self->{ _DEFBLOCKS };
150 my $output;
151
152
153 # check we're not already visiting this template
154 return $context->throw(Template::Constants::ERROR_FILE,
155 "recursion into '$self->{ name }'")
156 if $self->{ _HOT } && ! $context->{ RECURSION }; ## RETURN ##
157
158 $context->visit($self, $defblocks);
159
160 $self->{ _HOT } = 1;
161 eval {
162 my $block = $self->{ _BLOCK };
163 $output = &$block($context);
164 };
165 $self->{ _HOT } = 0;
166
167 $context->leave();
168
169 die $context->catch($@)
170 if $@;
171
172 return $output;
173}
174
175
176#------------------------------------------------------------------------
177# AUTOLOAD
178#
179# Provides pseudo-methods for read-only access to various internal
180# members.
181#------------------------------------------------------------------------
182
183sub AUTOLOAD {
184 my $self = shift;
185 my $method = $AUTOLOAD;
186
187 $method =~ s/.*:://;
188 return if $method eq 'DESTROY';
189# my ($pkg, $file, $line) = caller();
190# print STDERR "called $self->AUTOLOAD($method) from $file line $line\n";
191 return $self->{ $method };
192}
193
194
195#========================================================================
196# ----- PRIVATE METHODS -----
197#========================================================================
198
199
200#------------------------------------------------------------------------
201# _dump()
202#
203# Debug method which returns a string representing the internal state
204# of the object.
205#------------------------------------------------------------------------
206
207sub _dump {
208 my $self = shift;
209 my $dblks;
210 my $output = "$self : $self->{ name }\n";
211
212 $output .= "BLOCK: $self->{ _BLOCK }\nDEFBLOCKS:\n";
213
214 if ($dblks = $self->{ _DEFBLOCKS }) {
215 foreach my $b (keys %$dblks) {
216 $output .= " $b: $dblks->{ $b }\n";
217 }
218 }
219
220 return $output;
221}
222
223
224#========================================================================
225# ----- CLASS METHODS -----
226#========================================================================
227
228#------------------------------------------------------------------------
229# as_perl($content)
230#
231# This method expects a reference to a hash passed as the first argument
232# containing 3 items:
233# METADATA # a hash of template metadata
234# BLOCK # string containing Perl sub definition for main block
235# DEFBLOCKS # hash containing further subs for addional BLOCK defs
236# It returns a string containing Perl code which, when evaluated and
237# executed, will instantiate a new Template::Document object with the
238# above data. On error, it returns undef with an appropriate error
239# message set in $ERROR.
240#------------------------------------------------------------------------
241
242sub as_perl {
243 my ($class, $content) = @_;
244 my ($block, $defblocks, $metadata) = @$content{ qw( BLOCK DEFBLOCKS METADATA ) };
245
246 $block =~ s/\n(?!#line)/\n /g;
247 $block =~ s/\s+$//;
248
249 $defblocks = join('', map {
250 my $code = $defblocks->{ $_ };
251 $code =~ s/\n(?!#line)/\n /g;
252 $code =~ s/\s*$//;
253 " '$_' => $code,\n";
254 } keys %$defblocks);
255 $defblocks =~ s/\s+$//;
256
257 $metadata = join('', map {
258 my $x = $metadata->{ $_ };
259 $x =~ s/(['\\])/\\$1/g;
260 " '$_' => '$x',\n";
261 } keys %$metadata);
262 $metadata =~ s/\s+$//;
263
264 return <<EOF
265#------------------------------------------------------------------------
266# Compiled template generated by the Template Toolkit version $Template::VERSION
267#------------------------------------------------------------------------
268
269$class->new({
270 METADATA => {
271$metadata
272 },
273 BLOCK => $block,
274 DEFBLOCKS => {
275$defblocks
276 },
277});
278EOF
279}
280
281
282#------------------------------------------------------------------------
283# write_perl_file($filename, \%content)
284#
285# This method calls as_perl() to generate the Perl code to represent a
286# compiled template with the content passed as the second argument.
287# It then writes this to the file denoted by the first argument.
288#
289# Returns 1 on success. On error, sets the $ERROR package variable
290# to contain an error message and returns undef.
291#------------------------------------------------------------------------
292
293sub write_perl_file {
294 my ($class, $file, $content) = @_;
295 my ($fh, $tmpfile);
296
297 return $class->error("invalid filename: $file")
298 unless $file =~ /^(.+)$/s;
299
300 eval {
301 require File::Temp;
302 require File::Basename;
303 ($fh, $tmpfile) = File::Temp::tempfile(
304 DIR => File::Basename::dirname($file)
305 );
306 my $perlcode = $class->as_perl($content) || die $!;
307
308 if ($UNICODE && is_utf8($perlcode)) {
309 $perlcode = "use utf8;\n\n$perlcode";
310 binmode $fh, ":utf8";
311 }
312 print $fh $perlcode;
313 close($fh);
314 };
315 return $class->error($@) if $@;
316 return rename($tmpfile, $file)
317 || $class->error($!);
318}
319
320
321#------------------------------------------------------------------------
322# catch_warnings($msg)
323#
324# Installed as
325#------------------------------------------------------------------------
326
327sub catch_warnings {
328 $COMPERR .= join('', @_);
329}
330
331
3321;
333
334__END__