← 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:11 2016

Filename/Users/timbo/perl5/perlbrew/perls/perl-5.18.2/lib/5.18.2/darwin-2level/re.pm
StatementsExecuted 103 statements in 1.36ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
411114µs134µsre::::bitsre::bits
44420µs154µsre::::importre::import
62112µs12µsre::::CORE:substre::CORE:subst (opcode)
11111µs22µsre::::BEGIN@4re::BEGIN@4
9217µs7µsre::::CORE:matchre::CORE:match (opcode)
1116µs10µsre::::BEGIN@5re::BEGIN@5
0000s0sre::::_load_unloadre::_load_unload
0000s0sre::::setcolorre::setcolor
0000s0sre::::unimportre::unimport
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package re;
2
3# pragma for controlling the regexp engine
4223µs234µs
# spent 22µs (11+11) within re::BEGIN@4 which was called: # once (11µs+11µs) by utf8::BEGIN@4 at line 4
use strict;
# spent 22µs making 1 call to re::BEGIN@4 # spent 11µs making 1 call to strict::import
52834µs213µs
# spent 10µs (6+3) within re::BEGIN@5 which was called: # once (6µs+3µs) by utf8::BEGIN@4 at line 5
use warnings;
# spent 10µs making 1 call to re::BEGIN@5 # spent 3µs making 1 call to warnings::import
6
71400nsour $VERSION = "0.23";
816µsour @ISA = qw(Exporter);
911µsour @EXPORT_OK = ('regmust',
10 qw(is_regexp regexp_pattern
11 regname regnames regnames_count));
1215µsour %EXPORT_OK = map { $_ => 1 } @EXPORT_OK;
13
141800nsmy %bitmask = (
15 taint => 0x00100000, # HINT_RE_TAINT
16 eval => 0x00200000, # HINT_RE_EVAL
17);
18
191100nsmy $flags_hint = 0x02000000; # HINT_RE_FLAGS
201100nsmy $PMMOD_SHIFT = 0;
2114µsmy %reflags = (
22 m => 1 << ($PMMOD_SHIFT + 0),
23 s => 1 << ($PMMOD_SHIFT + 1),
24 i => 1 << ($PMMOD_SHIFT + 2),
25 x => 1 << ($PMMOD_SHIFT + 3),
26 p => 1 << ($PMMOD_SHIFT + 4),
27# special cases:
28 d => 0,
29 l => 1,
30 u => 2,
31 a => 3,
32 aa => 4,
33);
34
35sub setcolor {
36 eval { # Ignore errors
37 require Term::Cap;
38
39 my $terminal = Tgetent Term::Cap ({OSPEED => 9600}); # Avoid warning.
40 my $props = $ENV{PERL_RE_TC} || 'md,me,so,se,us,ue';
41 my @props = split /,/, $props;
42 my $colors = join "\t", map {$terminal->Tputs($_,1)} @props;
43
44 $colors =~ s/\0//g;
45 $ENV{PERL_RE_COLORS} = $colors;
46 };
47 if ($@) {
48 $ENV{PERL_RE_COLORS} ||= qq'\t\t> <\t> <\t\t';
49 }
50
51}
52
5318µsmy %flags = (
54 COMPILE => 0x0000FF,
55 PARSE => 0x000001,
56 OPTIMISE => 0x000002,
57 TRIEC => 0x000004,
58 DUMP => 0x000008,
59 FLAGS => 0x000010,
60
61 EXECUTE => 0x00FF00,
62 INTUIT => 0x000100,
63 MATCH => 0x000200,
64 TRIEE => 0x000400,
65
66 EXTRA => 0xFF0000,
67 TRIEM => 0x010000,
68 OFFSETS => 0x020000,
69 OFFSETSDBG => 0x040000,
70 STATE => 0x080000,
71 OPTIMISEM => 0x100000,
72 STACK => 0x280000,
73 BUFFERS => 0x400000,
74 GPOS => 0x800000,
75);
7611µs$flags{ALL} = -1 & ~($flags{OFFSETS}|$flags{OFFSETSDBG}|$flags{BUFFERS});
771500ns$flags{All} = $flags{all} = $flags{DUMP} | $flags{EXECUTE};
781400ns$flags{Extra} = $flags{EXECUTE} | $flags{COMPILE} | $flags{GPOS};
791500ns$flags{More} = $flags{MORE} = $flags{All} | $flags{TRIEC} | $flags{TRIEM} | $flags{STATE};
801300ns$flags{State} = $flags{DUMP} | $flags{EXECUTE} | $flags{STATE};
811300ns$flags{TRIE} = $flags{DUMP} | $flags{EXECUTE} | $flags{TRIEC};
82
8312µsif (defined &DynaLoader::boot_DynaLoader) {
841500ns require XSLoader;
851309µs1302µs XSLoader::load();
# spent 302µs making 1 call to XSLoader::load
86}
87# else we're miniperl
88# We need to work for miniperl, because the XS toolchain uses Text::Wrap, which
89# uses re 'taint'.
90
91sub _load_unload {
92 my ($on)= @_;
93 if ($on) {
94 # We call install() every time, as if we didn't, we wouldn't
95 # "see" any changes to the color environment var since
96 # the last time it was called.
97
98 # install() returns an integer, which if casted properly
99 # in C resolves to a structure containing the regexp
100 # hooks. Setting it to a random integer will guarantee
101 # segfaults.
102 $^H{regcomp} = install();
103 } else {
104 delete $^H{regcomp};
105 }
106}
107
108
# spent 134µs (114+19) within re::bits which was called 4 times, avg 33µs/call: # 4 times (114µs+19µs) by re::import at line 215, avg 33µs/call
sub bits {
10941µs my $on = shift;
1104900ns my $bits = 0;
111 ARG:
11247µs foreach my $idx (0..$#_){
11342µs my $s=$_[$idx];
114427µs36µs if ($s eq 'Debug' or $s eq 'Debugcolor') {
# spent 6µs making 3 calls to re::CORE:subst, avg 2µs/call
115 setcolor() if $s =~/color/i;
116 ${^RE_DEBUG_FLAGS} = 0 unless defined ${^RE_DEBUG_FLAGS};
117 for my $idx ($idx+1..$#_) {
118 if ($flags{$_[$idx]}) {
119 if ($on) {
120 ${^RE_DEBUG_FLAGS} |= $flags{$_[$idx]};
121 } else {
122 ${^RE_DEBUG_FLAGS} &= ~ $flags{$_[$idx]};
123 }
124 } else {
125 require Carp;
126 Carp::carp("Unknown \"re\" Debug flag '$_[$idx]', possible flags: ",
127 join(", ",sort keys %flags ) );
128 }
129 }
130 _load_unload($on ? 1 : ${^RE_DEBUG_FLAGS});
131 last;
132 } elsif ($s eq 'debug' or $s eq 'debugcolor') {
133 setcolor() if $s =~/color/i;
134 _load_unload($on);
135 last;
136 } elsif (exists $bitmask{$s}) {
137 $bits |= $bitmask{$s};
138 } elsif ($EXPORT_OK{$s}) {
139 require Exporter;
140 re->export_to_level(2, 're', $s);
141 } elsif ($s =~ s/^\///) {
14232µs my $reflags = $^H{reflags} || 0;
1433100ns my $seen_charset;
144312µs34µs while ($s =~ m/( . )/gx) {
# spent 4µs making 3 calls to re::CORE:match, avg 1µs/call
14534µs local $_ = $1;
146315µs63µs if (/[adul]/) {
# spent 3µs making 6 calls to re::CORE:match, avg 500ns/call
147 # The 'a' may be repeated; hide this from the rest of the
148 # code by counting and getting rid of all of them, then
149 # changing to 'aa' if there is a repeat.
15032µs if ($_ eq 'a') {
15131µs my $sav_pos = pos $s;
152313µs37µs my $a_count = $s =~ s/a//g;
# spent 7µs making 3 calls to re::CORE:subst, avg 2µs/call
15335µs pos $s = $sav_pos - 1; # -1 because got rid of the 'a'
15432µs if ($a_count > 2) {
155 require Carp;
156 Carp::carp(
157 qq 'The "a" flag may only appear a maximum of twice'
158 );
159 }
160 elsif ($a_count == 2) {
16131µs $_ = 'aa';
162 }
163 }
1643700ns if ($on) {
1653300ns if ($seen_charset) {
166 require Carp;
167 if ($seen_charset ne $_) {
168 Carp::carp(
169 qq 'The "$seen_charset" and "$_" flags '
170 .qq 'are exclusive'
171 );
172 }
173 else {
174 Carp::carp(
175 qq 'The "$seen_charset" flag may not appear '
176 .qq 'twice'
177 );
178 }
179 }
180316µs $^H{reflags_charset} = $reflags{$_};
1813900ns $seen_charset = $_;
182 }
183 else {
184 delete $^H{reflags_charset}
185 if defined $^H{reflags_charset}
186 && $^H{reflags_charset} == $reflags{$_};
187 }
188 } elsif (exists $reflags{$_}) {
189 $on
190 ? $reflags |= $reflags{$_}
191 : ($reflags &= ~$reflags{$_});
192 } else {
193 require Carp;
194 Carp::carp(
195 qq'Unknown regular expression flag "$_"'
196 );
197 next ARG;
198 }
199 }
20038µs ($^H{reflags} = $reflags or defined $^H{reflags_charset})
201 ? $^H |= $flags_hint
202 : ($^H &= ~$flags_hint);
203 } else {
204 require Carp;
205 Carp::carp("Unknown \"re\" subpragma '$s' (known ones are: ",
206 join(', ', map {qq('$_')} 'debug', 'debugcolor', sort keys %bitmask),
207 ")");
208 }
209 }
210411µs $bits;
211}
212
213
# spent 154µs (20+134) within re::import which was called 4 times, avg 38µs/call: # once (6µs+51µs) by utf8::BEGIN@4 at line 4 of utf8_heavy.pl # once (4µs+41µs) by _charnames::BEGIN@14 at line 14 of _charnames.pm # once (4µs+33µs) by charnames::BEGIN@9 at line 9 of charnames.pm # once (7µs+9µs) by Text::Wrap::BEGIN@58 at line 58 of Text/Wrap.pm
sub import {
2144600ns shift;
215421µs4134µs $^H |= bits(1, @_);
# spent 134µs making 4 calls to re::bits, avg 33µs/call
216}
217
218sub unimport {
219 shift;
220 $^H &= ~ bits(0, @_);
221}
222
223114µs1;
224
225__END__
 
# spent 7µs within re::CORE:match which was called 9 times, avg 800ns/call: # 6 times (3µs+0s) by re::bits at line 146, avg 500ns/call # 3 times (4µs+0s) by re::bits at line 144, avg 1µs/call
sub re::CORE:match; # opcode
# spent 12µs within re::CORE:subst which was called 6 times, avg 2µs/call: # 3 times (7µs+0s) by re::bits at line 152, avg 2µs/call # 3 times (6µs+0s) by re::bits at line 114, avg 2µs/call
sub re::CORE:subst; # opcode