← Index
NYTProf Performance Profile   « line view »
For rbm/rbm
  Run on Wed Feb 12 20:36:06 2020
Reported on Wed Feb 12 21:42:25 2020

Filename/usr/lib/x86_64-linux-gnu/perl5/5.28/Template/Document.pm
StatementsExecuted 11667401 statements in 95.4s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
3764001182.2s83.1sTemplate::Document::::newTemplate::Document::new
3764001110.0s1622sTemplate::Document::::processTemplate::Document::process (recurses: max depth 41, inclusive time 30214s)
376400222.70s4.04sTemplate::Document::::AUTOLOADTemplate::Document::AUTOLOAD
37538711626ms626msTemplate::Document::::blocksTemplate::Document::blocks
11110µs11µsTemplate::Document::::BEGIN@24Template::Document::BEGIN@24
1116µs18µsTemplate::Document::::BEGIN@25Template::Document::BEGIN@25
1115µs16µsTemplate::Document::::BEGIN@27Template::Document::BEGIN@27
1115µs5µsTemplate::Document::::BEGIN@34Template::Document::BEGIN@34
1115µs40µsTemplate::Document::::BEGIN@26Template::Document::BEGIN@26
0000s0sTemplate::Document::::_dumpTemplate::Document::_dump
0000s0sTemplate::Document::::as_perlTemplate::Document::as_perl
0000s0sTemplate::Document::::blockTemplate::Document::block
0000s0sTemplate::Document::::catch_warningsTemplate::Document::catch_warnings
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
24223µs213µ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
use strict;
# spent 11µs making 1 call to Template::Document::BEGIN@24 # spent 2µs making 1 call to strict::import
25219µs230µ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
use warnings;
# spent 18µs making 1 call to Template::Document::BEGIN@25 # spent 12µs making 1 call to warnings::import
26223µs275µ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
use base 'Template::Base';
# spent 40µs making 1 call to Template::Document::BEGIN@26 # spent 35µs making 1 call to base::import
272146µs226µ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
use Template::Constants;
# spent 16µs making 1 call to Template::Document::BEGIN@27 # spent 10µs making 1 call to Exporter::import
28
291300nsour $VERSION = 2.79;
301200nsour $DEBUG = 0 unless defined $DEBUG;
311200nsour $ERROR = '';
32our ($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
BEGIN {
35 # UNICODE is supported in versions of Perl from 5.008 onwards
3614µs if ($UNICODE = $] > 5.007 ? 1 : 0) {
3711µ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 }
471999µs15µ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
sub new {
64376400168ms my ($class, $doc) = @_;
65376400691ms my ($block, $defblocks, $variables, $metadata) = @$doc{ qw( BLOCK DEFBLOCKS VARIABLES METADATA ) };
66376400151ms $defblocks ||= { };
67376400157ms $metadata ||= { };
68
69 # evaluate Perl code in $block to create sub-routine reference if necessary
70376400285ms unless (ref $block) {
713764001.64s local $SIG{__WARN__} = \&catch_warnings;
72376400287ms $COMPERR = '';
73
74 # DON'T LOOK NOW! - blindly untainting can make you go blind!
753764002.52s376400931ms $block =~ /(.*)/s;
# spent 931ms making 376400 calls to Template::Document::CORE:match, avg 2µs/call
76376400750ms $block = $1;
77
7837640070.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.
79376400718ms 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 {
87376400751ms ref($_)
88 ? $_
89 : ( /(.*)/s && eval($1) or return $class->error($@) )
90 } values %$defblocks;
91
923764004.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
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 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
sub blocks {
1243753871.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
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
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
sub process {
148376400126ms my ($self, $context) = @_;
149376400341ms my $defblocks = $self->{ _DEFBLOCKS };
15037640092.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 }'")
156376400150ms if $self->{ _HOT } && ! $context->{ RECURSION }; ## RETURN ##
157
158376400976ms3764001.22s $context->visit($self, $defblocks);
# spent 1.22s making 376400 calls to Template::Context::visit, avg 3µs/call
159
160376400180ms $self->{ _HOT } = 1;
161376400234ms eval {
162376400217ms my $block = $self->{ _BLOCK };
163376400663ms37640031825s $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 };
165376400252ms $self->{ _HOT } = 0;
166
167376400849ms376400754ms $context->leave();
# spent 754ms making 376400 calls to Template::Context::leave, avg 2µs/call
168
16937640096.5ms die $context->catch($@)
170 if $@;
171
1723764001.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
sub AUTOLOAD {
184376400168ms my $self = shift;
185376400234ms my $method = $AUTOLOAD;
186
1873764003.04s3764001.33s $method =~ s/.*:://;
# spent 1.33s making 376400 calls to Template::Document::CORE:subst, avg 4µs/call
1883764001.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
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/\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});
276EOF
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
291sub 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
325sub catch_warnings {
326 $COMPERR .= join('', @_);
327}
328
329
33014µs1;
331
332__END__