Filename | /usr/lib/x86_64-linux-gnu/perl5/5.28/Template/Document.pm |
Statements | Executed 11667401 statements in 95.4s |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
376400 | 1 | 1 | 82.2s | 83.1s | new | Template::Document::
376400 | 1 | 1 | 10.0s | 1622s | process (recurses: max depth 41, inclusive time 30214s) | Template::Document::
376400 | 2 | 2 | 2.70s | 4.04s | AUTOLOAD | Template::Document::
375387 | 1 | 1 | 626ms | 626ms | blocks | Template::Document::
1 | 1 | 1 | 10µs | 11µs | BEGIN@24 | Template::Document::
1 | 1 | 1 | 6µs | 18µs | BEGIN@25 | Template::Document::
1 | 1 | 1 | 5µs | 16µs | BEGIN@27 | Template::Document::
1 | 1 | 1 | 5µs | 5µs | BEGIN@34 | Template::Document::
1 | 1 | 1 | 5µs | 40µs | BEGIN@26 | Template::Document::
0 | 0 | 0 | 0s | 0s | _dump | Template::Document::
0 | 0 | 0 | 0s | 0s | as_perl | Template::Document::
0 | 0 | 0 | 0s | 0s | block | Template::Document::
0 | 0 | 0 | 0s | 0s | catch_warnings | Template::Document::
0 | 0 | 0 | 0s | 0s | variables | Template::Document::
0 | 0 | 0 | 0s | 0s | write_perl_file | Template::Document::
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 | |||||
22 | package Template::Document; | ||||
23 | |||||
24 | 2 | 23µs | 2 | 13µs | # spent 11µs (10+2) within Template::Document::BEGIN@24 which was called:
# once (10µs+2µs) by Template::Provider::BEGIN@46 at line 24 # spent 11µs making 1 call to Template::Document::BEGIN@24
# spent 2µs making 1 call to strict::import |
25 | 2 | 19µs | 2 | 30µs | # spent 18µs (6+12) within Template::Document::BEGIN@25 which was called:
# once (6µs+12µs) by Template::Provider::BEGIN@46 at line 25 # spent 18µs making 1 call to Template::Document::BEGIN@25
# spent 12µs making 1 call to warnings::import |
26 | 2 | 23µs | 2 | 75µs | # spent 40µs (5+35) within Template::Document::BEGIN@26 which was called:
# once (5µs+35µs) by Template::Provider::BEGIN@46 at line 26 # spent 40µs making 1 call to Template::Document::BEGIN@26
# spent 35µs making 1 call to base::import |
27 | 2 | 146µs | 2 | 26µs | # spent 16µs (5+11) within Template::Document::BEGIN@27 which was called:
# once (5µs+11µs) by Template::Provider::BEGIN@46 at line 27 # spent 16µs making 1 call to Template::Document::BEGIN@27
# spent 10µs making 1 call to Exporter::import |
28 | |||||
29 | 1 | 300ns | our $VERSION = 2.79; | ||
30 | 1 | 200ns | our $DEBUG = 0 unless defined $DEBUG; | ||
31 | 1 | 200ns | our $ERROR = ''; | ||
32 | our ($COMPERR, $AUTOLOAD, $UNICODE); | ||||
33 | |||||
34 | # spent 5µs within Template::Document::BEGIN@34 which was called:
# once (5µs+0s) by Template::Provider::BEGIN@46 at line 47 | ||||
35 | # UNICODE is supported in versions of Perl from 5.008 onwards | ||||
36 | 1 | 4µs | if ($UNICODE = $] > 5.007 ? 1 : 0) { | ||
37 | 1 | 1µs | 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 | } | ||||
47 | 1 | 999µs | 1 | 5µs | } # spent 5µ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 | |||||
63 | # spent 83.1s (82.2+931ms) within Template::Document::new which was called 376400 times, avg 221µs/call:
# 376400 times (82.2s+931ms) by Template::Provider::_compile at line 894 of Template/Provider.pm, avg 221µs/call | ||||
64 | 376400 | 168ms | my ($class, $doc) = @_; | ||
65 | 376400 | 691ms | my ($block, $defblocks, $variables, $metadata) = @$doc{ qw( BLOCK DEFBLOCKS VARIABLES METADATA ) }; | ||
66 | 376400 | 151ms | $defblocks ||= { }; | ||
67 | 376400 | 157ms | $metadata ||= { }; | ||
68 | |||||
69 | # evaluate Perl code in $block to create sub-routine reference if necessary | ||||
70 | 376400 | 285ms | unless (ref $block) { | ||
71 | 376400 | 1.64s | local $SIG{__WARN__} = \&catch_warnings; | ||
72 | 376400 | 287ms | $COMPERR = ''; | ||
73 | |||||
74 | # DON'T LOOK NOW! - blindly untainting can make you go blind! | ||||
75 | 376400 | 2.52s | 376400 | 931ms | $block =~ /(.*)/s; # spent 931ms making 376400 calls to Template::Document::CORE:match, avg 2µs/call |
76 | 376400 | 750ms | $block = $1; | ||
77 | |||||
78 | 376400 | 70.1s | $block = eval $block; # spent 5.50s executing statements in 376400 string evals (merged) # includes 3.08s spent executing 207930 calls to 1 sub defined therein. | ||
79 | 376400 | 718ms | 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 | 376400 | 751ms | ref($_) | ||
88 | ? $_ | ||||
89 | : ( /(.*)/s && eval($1) or return $class->error($@) ) | ||||
90 | } values %$defblocks; | ||||
91 | |||||
92 | 376400 | 4.33s | 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 | |||||
109 | sub 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 name and the values | ||||
119 | # are references to Template::Document objects. Returns 0 (# an empty hash) | ||||
120 | # if no blocks are defined. | ||||
121 | #------------------------------------------------------------------------ | ||||
122 | |||||
123 | # spent 626ms within Template::Document::blocks which was called 375387 times, avg 2µs/call:
# 375387 times (626ms+0s) by Template::Context::process at line 339 of Template/Context.pm, avg 2µs/call | ||||
124 | 375387 | 1.79s | 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 | |||||
135 | sub 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 | |||||
147 | # spent 1622s (10.0+1612) within Template::Document::process which was called 376400 times, avg 4.31ms/call:
# 376400 times (10.0s+1612s) by Template::Context::process at line 347 of Template/Context.pm, avg 4.31ms/call | ||||
148 | 376400 | 126ms | my ($self, $context) = @_; | ||
149 | 376400 | 341ms | my $defblocks = $self->{ _DEFBLOCKS }; | ||
150 | 376400 | 92.8ms | 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 | 376400 | 150ms | if $self->{ _HOT } && ! $context->{ RECURSION }; ## RETURN ## | ||
157 | |||||
158 | 376400 | 976ms | 376400 | 1.22s | $context->visit($self, $defblocks); # spent 1.22s making 376400 calls to Template::Context::visit, avg 3µs/call |
159 | |||||
160 | 376400 | 180ms | $self->{ _HOT } = 1; | ||
161 | 376400 | 234ms | eval { | ||
162 | 376400 | 217ms | my $block = $self->{ _BLOCK }; | ||
163 | 376400 | 663ms | 376400 | 31825s | $output = &$block($context); # spent 10732s making 146492 calls to Template::Document::__ANON__[input text:9], avg 73.3ms/call
# spent 9708s making 7982 calls to Template::Document::__ANON__[input text:10], avg 1.22s/call
# spent 8952s making 1990 calls to Template::Document::__ANON__[input text:18], avg 4.50s/call
# spent 1090s making 2 calls to Template::Document::__ANON__[/root/tor-browser-build/projects/snowflake/build:37], avg 545s/call
# spent 613s making 1991 calls to Template::Document::__ANON__[input text:43], avg 308ms/call
# spent 268s making 1008 calls to Template::Document::__ANON__[input text:35], avg 265ms/call
# spent 226s making 996 calls to Template::Document::__ANON__[/root/tor-browser-build/projects/go/build:90], avg 227ms/call
# spent 179s making 1991 calls to Template::Document::__ANON__[input text:17], avg 90.0ms/call
# spent 25.6s making 2978 calls to Template::Document::__ANON__[input text:13], avg 8.59ms/call
# spent 14.9s making 995 calls to Template::Document::__ANON__[input text:30], avg 15.0ms/call
# spent 4.89s making 28 calls to Template::Document::__ANON__[input text:11], avg 175ms/call
# spent 4.81s making 1991 calls to Template::Document::__ANON__[input text:22], avg 2.42ms/call
# spent 3.44s making 207930 calls to Template::Document::__ANON__[(eval 100)[Template/Document.pm:78]:16], avg 17µs/call
# spent 1.97s making 9 calls to Template::Document::__ANON__[input text:21], avg 219ms/call
# spent 1.03s making 15 calls to Template::Document::__ANON__[/root/tor-browser-build/projects/common/runc-config.json:263], avg 68.8ms/call
# spent 12.3ms making 1 call to Template::Document::__ANON__[input text:25]
# spent 2.77ms making 1 call to Template::Document::__ANON__[input text:12] |
164 | }; | ||||
165 | 376400 | 252ms | $self->{ _HOT } = 0; | ||
166 | |||||
167 | 376400 | 849ms | 376400 | 754ms | $context->leave(); # spent 754ms making 376400 calls to Template::Context::leave, avg 2µs/call |
168 | |||||
169 | 376400 | 96.5ms | die $context->catch($@) | ||
170 | if $@; | ||||
171 | |||||
172 | 376400 | 1.77s | return $output; | ||
173 | } | ||||
174 | |||||
175 | |||||
176 | #------------------------------------------------------------------------ | ||||
177 | # AUTOLOAD | ||||
178 | # | ||||
179 | # Provides pseudo-methods for read-only access to various internal | ||||
180 | # members. | ||||
181 | #------------------------------------------------------------------------ | ||||
182 | |||||
183 | # spent 4.04s (2.70+1.33) within Template::Document::AUTOLOAD which was called 376400 times, avg 11µs/call:
# 375387 times (2.70s+1.33s) by Template::Service::process at line 132 of Template/Service.pm, avg 11µs/call
# 1013 times (2.52ms+1.44ms) by RBM::process_template at line 675 of /root/tor-browser-build/rbm/lib/RBM.pm, avg 4µs/call | ||||
184 | 376400 | 168ms | my $self = shift; | ||
185 | 376400 | 234ms | my $method = $AUTOLOAD; | ||
186 | |||||
187 | 376400 | 3.04s | 376400 | 1.33s | $method =~ s/.*:://; # spent 1.33s making 376400 calls to Template::Document::CORE:subst, avg 4µs/call |
188 | 376400 | 1.71s | 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 | |||||
207 | sub _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 | |||||
242 | sub as_perl { | ||||
243 | my ($class, $content) = @_; | ||||
244 | my ($block, $defblocks, $metadata) = @$content{ qw( BLOCK DEFBLOCKS METADATA ) }; | ||||
245 | |||||
246 | $block =~ s/\s+$//; | ||||
247 | |||||
248 | $defblocks = join('', map { | ||||
249 | my $code = $defblocks->{ $_ }; | ||||
250 | $code =~ s/\s*$//; | ||||
251 | " '$_' => $code,\n"; | ||||
252 | } keys %$defblocks); | ||||
253 | $defblocks =~ s/\s+$//; | ||||
254 | |||||
255 | $metadata = join('', map { | ||||
256 | my $x = $metadata->{ $_ }; | ||||
257 | $x =~ s/(['\\])/\\$1/g; | ||||
258 | " '$_' => '$x',\n"; | ||||
259 | } keys %$metadata); | ||||
260 | $metadata =~ s/\s+$//; | ||||
261 | |||||
262 | return <<EOF | ||||
263 | #------------------------------------------------------------------------ | ||||
264 | # Compiled template generated by the Template Toolkit version $Template::VERSION | ||||
265 | #------------------------------------------------------------------------ | ||||
266 | |||||
267 | $class->new({ | ||||
268 | METADATA => { | ||||
269 | $metadata | ||||
270 | }, | ||||
271 | BLOCK => $block, | ||||
272 | DEFBLOCKS => { | ||||
273 | $defblocks | ||||
274 | }, | ||||
275 | }); | ||||
276 | EOF | ||||
277 | } | ||||
278 | |||||
279 | |||||
280 | #------------------------------------------------------------------------ | ||||
281 | # write_perl_file($filename, \%content) | ||||
282 | # | ||||
283 | # This method calls as_perl() to generate the Perl code to represent a | ||||
284 | # compiled template with the content passed as the second argument. | ||||
285 | # It then writes this to the file denoted by the first argument. | ||||
286 | # | ||||
287 | # Returns 1 on success. On error, sets the $ERROR package variable | ||||
288 | # to contain an error message and returns undef. | ||||
289 | #------------------------------------------------------------------------ | ||||
290 | |||||
291 | sub write_perl_file { | ||||
292 | my ($class, $file, $content) = @_; | ||||
293 | my ($fh, $tmpfile); | ||||
294 | |||||
295 | return $class->error("invalid filename: $file") | ||||
296 | unless $file =~ /^(.+)$/s; | ||||
297 | |||||
298 | eval { | ||||
299 | require File::Temp; | ||||
300 | require File::Basename; | ||||
301 | ($fh, $tmpfile) = File::Temp::tempfile( | ||||
302 | DIR => File::Basename::dirname($file) | ||||
303 | ); | ||||
304 | my $perlcode = $class->as_perl($content) || die $!; | ||||
305 | |||||
306 | if ($UNICODE && is_utf8($perlcode)) { | ||||
307 | $perlcode = "use utf8;\n\n$perlcode"; | ||||
308 | binmode $fh, ":utf8"; | ||||
309 | } | ||||
310 | print $fh $perlcode; | ||||
311 | close($fh); | ||||
312 | }; | ||||
313 | return $class->error($@) if $@; | ||||
314 | return rename($tmpfile, $file) | ||||
315 | || $class->error($!); | ||||
316 | } | ||||
317 | |||||
318 | |||||
319 | #------------------------------------------------------------------------ | ||||
320 | # catch_warnings($msg) | ||||
321 | # | ||||
322 | # Installed as | ||||
323 | #------------------------------------------------------------------------ | ||||
324 | |||||
325 | sub catch_warnings { | ||||
326 | $COMPERR .= join('', @_); | ||||
327 | } | ||||
328 | |||||
329 | |||||
330 | 1 | 4µs | 1; | ||
331 | |||||
332 | __END__ |