← Index
NYTProf Performance Profile   « line view »
For /Users/timbo/perl5/perlbrew/perls/perl-5.18.2/bin/perlcritic
  Run on Sat Mar 19 22:12:22 2016
Reported on Sat Mar 19 22:14:10 2016

Filename/Users/timbo/perl5/perlbrew/perls/perl-5.18.2/lib/site_perl/5.18.2/PPI/Token/Structure.pm
StatementsExecuted 62429 statements in 160ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
1336511133ms313msPPI::Token::Structure::::__TOKENIZER__commitPPI::Token::Structure::__TOKENIZER__commit
31571134.7ms69.1msPPI::Token::Structure::::__TOKENIZER__on_charPPI::Token::Structure::__TOKENIZER__on_char
57891110.0ms10.0msPPI::Token::Structure::::__LEXER__oppositePPI::Token::Structure::__LEXER__opposite
11111µs23µsPPI::Token::Structure::::BEGIN@31PPI::Token::Structure::BEGIN@31
11111µs11µsPPI::Token::Structure::::BEGIN@35PPI::Token::Structure::BEGIN@35
1118µs8µsPPI::Token::Structure::::BEGIN@43PPI::Token::Structure::BEGIN@43
1116µs33µsPPI::Token::Structure::::BEGIN@34PPI::Token::Structure::BEGIN@34
1116µs45µsPPI::Token::Structure::::BEGIN@42PPI::Token::Structure::BEGIN@42
1114µs4µsPPI::Token::Structure::::BEGIN@32PPI::Token::Structure::BEGIN@32
0000s0sPPI::Token::Structure::::next_siblingPPI::Token::Structure::next_sibling
0000s0sPPI::Token::Structure::::next_tokenPPI::Token::Structure::next_token
0000s0sPPI::Token::Structure::::previous_siblingPPI::Token::Structure::previous_sibling
0000s0sPPI::Token::Structure::::previous_tokenPPI::Token::Structure::previous_token
0000s0sPPI::Token::Structure::::snext_siblingPPI::Token::Structure::snext_sibling
0000s0sPPI::Token::Structure::::sprevious_siblingPPI::Token::Structure::sprevious_sibling
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package PPI::Token::Structure;
2
3=pod
4
5=head1 NAME
6
7PPI::Token::Structure - Token class for characters that define code structure
8
9=head1 INHERITANCE
10
11 PPI::Token::Structure
12 isa PPI::Token
13 isa PPI::Element
14
15=head1 DESCRIPTION
16
17The C<PPI::Token::Structure> class is used for tokens that control the
18generally tree structure or code.
19
20This consists of seven characters. These are the six brace characters from
21the "round", "curly" and "square" pairs, plus the semi-colon statement
22separator C<;>.
23
24=head1 METHODS
25
26This class has no methods beyond what is provided by its
27L<PPI::Token> and L<PPI::Element> parent classes.
28
29=cut
30
31218µs234µs
# spent 23µs (11+12) within PPI::Token::Structure::BEGIN@31 which was called: # once (11µs+12µs) by PPI::Token::BEGIN@68 at line 31
use strict;
# spent 23µs making 1 call to PPI::Token::Structure::BEGIN@31 # spent 12µs making 1 call to strict::import
32223µs14µs
# spent 4µs within PPI::Token::Structure::BEGIN@32 which was called: # once (4µs+0s) by PPI::Token::BEGIN@68 at line 32
use PPI::Token ();
# spent 4µs making 1 call to PPI::Token::Structure::BEGIN@32
33
34230µs260µs
# spent 33µs (6+27) within PPI::Token::Structure::BEGIN@34 which was called: # once (6µs+27µs) by PPI::Token::BEGIN@68 at line 34
use vars qw{$VERSION @ISA};
# spent 33µs making 1 call to PPI::Token::Structure::BEGIN@34 # spent 27µs making 1 call to vars::import
35
# spent 11µs within PPI::Token::Structure::BEGIN@35 which was called: # once (11µs+0s) by PPI::Token::BEGIN@68 at line 38
BEGIN {
361300ns $VERSION = '1.215';
37112µs @ISA = 'PPI::Token';
38118µs111µs}
# spent 11µs making 1 call to PPI::Token::Structure::BEGIN@35
39
40# Set the matching braces, done as an array
41# for slightly faster lookups.
42283µs284µs
# spent 45µs (6+39) within PPI::Token::Structure::BEGIN@42 which was called: # once (6µs+39µs) by PPI::Token::BEGIN@68 at line 42
use vars qw{@MATCH @OPENS @CLOSES};
# spent 45µs making 1 call to PPI::Token::Structure::BEGIN@42 # spent 39µs making 1 call to vars::import
43
# spent 8µs within PPI::Token::Structure::BEGIN@43 which was called: # once (8µs+0s) by PPI::Token::BEGIN@68 at line 58
BEGIN {
441600ns $MATCH[ord '{'] = '}';
4513µs $MATCH[ord '}'] = '{';
461200ns $MATCH[ord '['] = ']';
471100ns $MATCH[ord ']'] = '[';
481200ns $MATCH[ord '('] = ')';
491100ns $MATCH[ord ')'] = '(';
50
511300ns $OPENS[ord '{'] = 1;
521100ns $OPENS[ord '['] = 1;
5310s $OPENS[ord '('] = 1;
54
551200ns $CLOSES[ord '}'] = 1;
5610s $CLOSES[ord ']'] = 1;
5714µs $CLOSES[ord ')'] = 1;
581325µs18µs}
# spent 8µs making 1 call to PPI::Token::Structure::BEGIN@43
59
- -
64#####################################################################
65# Tokenizer Methods
66
67
# spent 69.1ms (34.7+34.5) within PPI::Token::Structure::__TOKENIZER__on_char which was called 3157 times, avg 22µs/call: # 3157 times (34.7ms+34.5ms) by PPI::Tokenizer::_process_next_char at line 554 of PPI/Tokenizer.pm, avg 22µs/call
sub __TOKENIZER__on_char {
68 # Structures are one character long, always.
69 # Finalize and process again.
70315733.7ms631434.5ms $_[1]->_finalize_token->__TOKENIZER__on_char( $_[1] );
# spent 27.6ms making 3157 calls to PPI::Token::Whitespace::__TOKENIZER__on_char, avg 9µs/call # spent 6.88ms making 3157 calls to PPI::Tokenizer::_finalize_token, avg 2µs/call
71}
72
73
# spent 313ms (133+180) within PPI::Token::Structure::__TOKENIZER__commit which was called 13365 times, avg 23µs/call: # 13365 times (133ms+180ms) by PPI::Token::Whitespace::__TOKENIZER__on_char at line 206 of PPI/Token/Whitespace.pm, avg 23µs/call
sub __TOKENIZER__commit {
74133652.37ms my $t = $_[1];
751336524.9ms13365150ms $t->_new_token( 'Structure', substr( $t->{line}, $t->{line_cursor}, 1 ) );
# spent 150ms making 13365 calls to PPI::Tokenizer::_new_token, avg 11µs/call
761336512.7ms1336529.4ms $t->_finalize_token;
# spent 29.4ms making 13365 calls to PPI::Tokenizer::_finalize_token, avg 2µs/call
771336553.5ms 0;
78}
79
- -
84#####################################################################
85# Lexer Methods
86
87# For a given brace, find its opposing pair
88
# spent 10.0ms within PPI::Token::Structure::__LEXER__opposite which was called 5789 times, avg 2µs/call: # 5789 times (10.0ms+0s) by PPI::Lexer::_lex_structure at line 1356 of PPI/Lexer.pm, avg 2µs/call
sub __LEXER__opposite {
89578932.3ms $MATCH[ord $_[0]->{content} ];
90}
91
- -
96#####################################################################
97# PPI::Element Methods
98
99# There is a unusual situation in regards to "siblings".
100#
101# As an Element, braces sit outside the normal tree structure, and in
102# this context they NEVER have siblings.
103#
104# However, as tokens they DO have siblings.
105#
106# As such, we need special versions of _all_ of the sibling methods to
107# handle this.
108#
109# Statement terminators do not have these problems, and for them sibling
110# calls work as normal, and so they can just be passed upwards.
111
112sub next_sibling {
113 return $_[0]->SUPER::next_sibling if $_[0]->{content} eq ';';
114 return '';
115}
116
117sub snext_sibling {
118 return $_[0]->SUPER::snext_sibling if $_[0]->{content} eq ';';
119 return '';
120}
121
122sub previous_sibling {
123 return $_[0]->SUPER::previous_sibling if $_[0]->{content} eq ';';
124 return '';
125}
126
127sub sprevious_sibling {
128 return $_[0]->SUPER::sprevious_sibling if $_[0]->{content} eq ';';
129 return '';
130}
131
132sub next_token {
133 my $self = shift;
134 return $self->SUPER::next_token if $self->{content} eq ';';
135 my $structure = $self->parent or return '';
136
137 # If this is an opening brace, descend down into our parent
138 # structure, if it has children.
139 if ( $OPENS[ ord $self->{content} ] ) {
140 my $child = $structure->child(0);
141 if ( $child ) {
142 # Decend deeper, or return if it is a token
143 return $child->isa('PPI::Token') ? $child : $child->first_token;
144 } elsif ( $structure->finish ) {
145 # Empty structure, so next is closing brace
146 return $structure->finish;
147 }
148
149 # Anything that slips through to here is a structure
150 # with an opening brace, but no closing brace, so we
151 # just have to go with it, and continue as we would
152 # if we started with a closing brace.
153 }
154
155 # We can use the default implement, if we call it from the
156 # parent structure of the closing brace.
157 $structure->next_token;
158}
159
160sub previous_token {
161 my $self = shift;
162 return $self->SUPER::previous_token if $self->{content} eq ';';
163 my $structure = $self->parent or return '';
164
165 # If this is a closing brace, descend down into our parent
166 # structure, if it has children.
167 if ( $CLOSES[ ord $self->{content} ] ) {
168 my $child = $structure->child(-1);
169 if ( $child ) {
170 # Decend deeper, or return if it is a token
171 return $child->isa('PPI::Token') ? $child : $child->last_token;
172 } elsif ( $structure->start ) {
173 # Empty structure, so next is closing brace
174 return $structure->start;
175 }
176
177 # Anything that slips through to here is a structure
178 # with a closing brace, but no opening brace, so we
179 # just have to go with it, and continue as we would
180 # if we started with a opening brace.
181 }
182
183 # We can use the default implement, if we call it from the
184 # parent structure of the closing brace.
185 $structure->previous_token;
186}
187
18812µs1;
189
190=pod
191
192=head1 SUPPORT
193
194See the L<support section|PPI/SUPPORT> in the main module.
195
196=head1 AUTHOR
197
198Adam Kennedy E<lt>adamk@cpan.orgE<gt>
199
200=head1 COPYRIGHT
201
202Copyright 2001 - 2011 Adam Kennedy.
203
204This program is free software; you can redistribute
205it and/or modify it under the same terms as Perl itself.
206
207The full text of the license can be found in the
208LICENSE file included with this module.
209
210=cut