Filename | /usr/share/perl5/XML/SAX.pm |
Statements | Executed 303 statements in 4.04ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 2.54ms | 2.77ms | BEGIN@16 | XML::SAX::
1 | 1 | 1 | 1.89ms | 3.78ms | BEGIN@15 | XML::SAX::
1 | 1 | 1 | 956µs | 3.85ms | BEGIN@18 | XML::SAX::
1 | 1 | 1 | 926µs | 1.54ms | _parse_ini_file | XML::SAX::
1 | 1 | 1 | 858µs | 987µs | BEGIN@17 | XML::SAX::
93 | 3 | 1 | 313µs | 313µs | CORE:subst (opcode) | XML::SAX::
68 | 2 | 1 | 219µs | 219µs | CORE:match (opcode) | XML::SAX::
32 | 1 | 1 | 82µs | 82µs | CORE:readline (opcode) | XML::SAX::
1 | 1 | 1 | 62µs | 1.95ms | load_parsers | XML::SAX::
1 | 1 | 1 | 57µs | 57µs | CORE:open (opcode) | XML::SAX::
1 | 1 | 1 | 19µs | 25µs | BEGIN@5 | XML::SAX::
1 | 1 | 1 | 16µs | 88µs | BEGIN@20 | XML::SAX::
1 | 1 | 1 | 15µs | 1.97ms | parsers | XML::SAX::
1 | 1 | 1 | 14µs | 82µs | BEGIN@22 | XML::SAX::
1 | 1 | 1 | 13µs | 75µs | BEGIN@23 | XML::SAX::
1 | 1 | 1 | 13µs | 107µs | BEGIN@6 | XML::SAX::
1 | 1 | 1 | 8µs | 8µs | BEGIN@10 | XML::SAX::
0 | 0 | 0 | 0s | 0s | add_parser | XML::SAX::
0 | 0 | 0 | 0s | 0s | do_warn | XML::SAX::
0 | 0 | 0 | 0s | 0s | remove_parser | XML::SAX::
0 | 0 | 0 | 0s | 0s | save_parsers | XML::SAX::
0 | 0 | 0 | 0s | 0s | save_parsers_debian | XML::SAX::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | # $Id: SAX.pm,v 1.29 2007/06/27 09:09:12 grant Exp $ | ||||
2 | |||||
3 | package XML::SAX; | ||||
4 | |||||
5 | 3 | 41µs | 2 | 31µs | # spent 25µs (19+6) within XML::SAX::BEGIN@5 which was called:
# once (19µs+6µs) by MARC::File::SAX::BEGIN@10 at line 5 # spent 25µs making 1 call to XML::SAX::BEGIN@5
# spent 6µs making 1 call to strict::import |
6 | 3 | 47µs | 2 | 201µs | # spent 107µs (13+94) within XML::SAX::BEGIN@6 which was called:
# once (13µs+94µs) by MARC::File::SAX::BEGIN@10 at line 6 # spent 107µs making 1 call to XML::SAX::BEGIN@6
# spent 94µs making 1 call to vars::import |
7 | |||||
8 | 1 | 2µs | $VERSION = '0.16'; | ||
9 | |||||
10 | 3 | 62µs | 1 | 8µs | # spent 8µs within XML::SAX::BEGIN@10 which was called:
# once (8µs+0s) by MARC::File::SAX::BEGIN@10 at line 10 # spent 8µs making 1 call to XML::SAX::BEGIN@10 |
11 | 1 | 10µs | @ISA = ('Exporter'); | ||
12 | |||||
13 | 1 | 2µs | @EXPORT_OK = qw(Namespaces Validation); | ||
14 | |||||
15 | 3 | 229µs | 2 | 3.87ms | # spent 3.78ms (1.89+1.89) within XML::SAX::BEGIN@15 which was called:
# once (1.89ms+1.89ms) by MARC::File::SAX::BEGIN@10 at line 15 # spent 3.78ms making 1 call to XML::SAX::BEGIN@15
# spent 90µs making 1 call to Exporter::import |
16 | 3 | 145µs | 1 | 2.77ms | # spent 2.77ms (2.54+229µs) within XML::SAX::BEGIN@16 which was called:
# once (2.54ms+229µs) by MARC::File::SAX::BEGIN@10 at line 16 # spent 2.77ms making 1 call to XML::SAX::BEGIN@16 |
17 | 3 | 159µs | 2 | 1.08ms | # spent 987µs (858+129) within XML::SAX::BEGIN@17 which was called:
# once (858µs+129µs) by MARC::File::SAX::BEGIN@10 at line 17 # spent 987µs making 1 call to XML::SAX::BEGIN@17
# spent 98µs making 1 call to Exporter::import |
18 | 3 | 171µs | 1 | 3.85ms | # spent 3.85ms (956µs+2.89) within XML::SAX::BEGIN@18 which was called:
# once (956µs+2.89ms) by MARC::File::SAX::BEGIN@10 at line 18 # spent 3.85ms making 1 call to XML::SAX::BEGIN@18 |
19 | |||||
20 | 3 | 45µs | 2 | 160µs | # spent 88µs (16+72) within XML::SAX::BEGIN@20 which was called:
# once (16µs+72µs) by MARC::File::SAX::BEGIN@10 at line 20 # spent 88µs making 1 call to XML::SAX::BEGIN@20
# spent 72µs making 1 call to constant::import |
21 | |||||
22 | 3 | 43µs | 2 | 150µs | # spent 82µs (14+68) within XML::SAX::BEGIN@22 which was called:
# once (14µs+68µs) by MARC::File::SAX::BEGIN@10 at line 22 # spent 82µs making 1 call to XML::SAX::BEGIN@22
# spent 68µs making 1 call to constant::import |
23 | 3 | 1.39ms | 2 | 137µs | # spent 75µs (13+62) within XML::SAX::BEGIN@23 which was called:
# once (13µs+62µs) by MARC::File::SAX::BEGIN@10 at line 23 # spent 75µs making 1 call to XML::SAX::BEGIN@23
# spent 62µs making 1 call to constant::import |
24 | |||||
25 | 1 | 1µs | my $known_parsers = undef; | ||
26 | |||||
27 | # load_parsers takes the ParserDetails.ini file out of the same directory | ||||
28 | # that XML::SAX is in, and looks at it. Format in POD below | ||||
29 | |||||
30 | =begin EXAMPLE | ||||
31 | |||||
- - | |||||
47 | # spent 1.95ms (62µs+1.89) within XML::SAX::load_parsers which was called:
# once (62µs+1.89ms) by XML::SAX::parsers at line 114 | ||||
48 | 1 | 2µs | my $class = shift; | ||
49 | 1 | 2µs | my $dir = shift; | ||
50 | |||||
51 | # reset parsers | ||||
52 | 1 | 1µs | $known_parsers = []; | ||
53 | |||||
54 | # get directory from wherever XML::SAX is installed | ||||
55 | 1 | 2µs | if (!$dir) { | ||
56 | 1 | 2µs | $dir = $INC{'XML/SAX.pm'}; | ||
57 | 1 | 6µs | 1 | 137µs | $dir = dirname($dir); # spent 137µs making 1 call to File::Basename::dirname |
58 | } | ||||
59 | |||||
60 | 1 | 6µs | 1 | 17µs | my $fh = gensym(); # spent 17µs making 1 call to Symbol::gensym |
61 | 1 | 75µs | 2 | 195µs | if (!open($fh, File::Spec->catfile($dir, "SAX", PARSER_DETAILS))) { # spent 138µs making 1 call to File::Spec::Unix::catfile
# spent 57µs making 1 call to XML::SAX::CORE:open |
62 | XML::SAX->do_warn("could not find " . PARSER_DETAILS . " in $dir/SAX\n"); | ||||
63 | return $class; | ||||
64 | } | ||||
65 | |||||
66 | 1 | 8µs | 1 | 1.54ms | $known_parsers = $class->_parse_ini_file($fh); # spent 1.54ms making 1 call to XML::SAX::_parse_ini_file |
67 | |||||
68 | 1 | 12µs | return $class; | ||
69 | } | ||||
70 | |||||
71 | # spent 1.54ms (926µs+614µs) within XML::SAX::_parse_ini_file which was called:
# once (926µs+614µs) by XML::SAX::load_parsers at line 66 | ||||
72 | 1 | 2µs | my $class = shift; | ||
73 | 1 | 1µs | my ($fh) = @_; | ||
74 | |||||
75 | 1 | 2µs | my @config; | ||
76 | |||||
77 | 1 | 1µs | my $lineno = 0; | ||
78 | 1 | 237µs | 32 | 82µs | while (defined(my $line = <$fh>)) { # spent 82µs making 32 calls to XML::SAX::CORE:readline, avg 3µs/call |
79 | 31 | 28µs | $lineno++; | ||
80 | 31 | 40µs | my $original = $line; | ||
81 | # strip whitespace | ||||
82 | 31 | 344µs | 31 | 222µs | $line =~ s/\s*$//m; # spent 222µs making 31 calls to XML::SAX::CORE:subst, avg 7µs/call |
83 | 31 | 153µs | 31 | 47µs | $line =~ s/^\s*//m; # spent 47µs making 31 calls to XML::SAX::CORE:subst, avg 2µs/call |
84 | # strip comments | ||||
85 | 31 | 143µs | 31 | 44µs | $line =~ s/[#;].*$//m; # spent 44µs making 31 calls to XML::SAX::CORE:subst, avg 1µs/call |
86 | # ignore blanks | ||||
87 | 31 | 159µs | 31 | 49µs | next if $line =~ /^$/m; # spent 49µs making 31 calls to XML::SAX::CORE:match, avg 2µs/call |
88 | |||||
89 | # heading | ||||
90 | 21 | 301µs | 37 | 170µs | if ($line =~ /^\[\s*(.*)\s*\]$/m) { # spent 170µs making 37 calls to XML::SAX::CORE:match, avg 5µs/call |
91 | 5 | 17µs | push @config, { Name => $1 }; | ||
92 | 5 | 9µs | next; | ||
93 | } | ||||
94 | |||||
95 | # instruction | ||||
96 | elsif ($line =~ /^(.*?)\s*?=\s*(.*)$/) { | ||||
97 | 16 | 19µs | unless(@config) { | ||
98 | push @config, { Name => '' }; | ||||
99 | } | ||||
100 | 16 | 73µs | $config[-1]{Features}{$1} = $2; | ||
101 | } | ||||
102 | |||||
103 | # not whitespace, comment, or instruction | ||||
104 | else { | ||||
105 | die "Invalid line in ini: $lineno\n>>> $original\n"; | ||||
106 | } | ||||
107 | } | ||||
108 | |||||
109 | 1 | 14µs | return \@config; | ||
110 | } | ||||
111 | |||||
112 | # spent 1.97ms (15µs+1.95) within XML::SAX::parsers which was called:
# once (15µs+1.95ms) by XML::SAX::ParserFactory::new at line 18 of XML/SAX/ParserFactory.pm | ||||
113 | 1 | 2µs | my $class = shift; | ||
114 | 1 | 6µs | 1 | 1.95ms | if (!$known_parsers) { # spent 1.95ms making 1 call to XML::SAX::load_parsers |
115 | $class->load_parsers(); | ||||
116 | } | ||||
117 | 1 | 11µs | return $known_parsers; | ||
118 | } | ||||
119 | |||||
120 | sub remove_parser { | ||||
121 | my $class = shift; | ||||
122 | my ($parser_module) = @_; | ||||
123 | |||||
124 | if (!$known_parsers) { | ||||
125 | $class->load_parsers(); | ||||
126 | } | ||||
127 | |||||
128 | @$known_parsers = grep { $_->{Name} ne $parser_module } @$known_parsers; | ||||
129 | |||||
130 | return $class; | ||||
131 | } | ||||
132 | |||||
133 | sub add_parser { | ||||
134 | my $class = shift; | ||||
135 | my ($parser_module) = @_; | ||||
136 | |||||
137 | if (!$known_parsers) { | ||||
138 | $class->load_parsers(); | ||||
139 | } | ||||
140 | |||||
141 | # first load module, then query features, then push onto known_parsers, | ||||
142 | |||||
143 | my $parser_file = $parser_module; | ||||
144 | $parser_file =~ s/::/\//g; | ||||
145 | $parser_file .= ".pm"; | ||||
146 | |||||
147 | require $parser_file; | ||||
148 | |||||
149 | my @features = $parser_module->supported_features(); | ||||
150 | |||||
151 | my $new = { Name => $parser_module }; | ||||
152 | foreach my $feature (@features) { | ||||
153 | $new->{Features}{$feature} = 1; | ||||
154 | } | ||||
155 | |||||
156 | # If exists in list already, move to end. | ||||
157 | my $done = 0; | ||||
158 | my $pos = undef; | ||||
159 | for (my $i = 0; $i < @$known_parsers; $i++) { | ||||
160 | my $p = $known_parsers->[$i]; | ||||
161 | if ($p->{Name} eq $parser_module) { | ||||
162 | $pos = $i; | ||||
163 | } | ||||
164 | } | ||||
165 | if (defined $pos) { | ||||
166 | splice(@$known_parsers, $pos, 1); | ||||
167 | push @$known_parsers, $new; | ||||
168 | $done++; | ||||
169 | } | ||||
170 | |||||
171 | # Otherwise (not in list), add at end of list. | ||||
172 | if (!$done) { | ||||
173 | push @$known_parsers, $new; | ||||
174 | } | ||||
175 | |||||
176 | return $class; | ||||
177 | } | ||||
178 | |||||
179 | sub save_parsers { | ||||
180 | my $class = shift; | ||||
181 | |||||
182 | ### DEBIAN MODIFICATION | ||||
183 | print "\n"; | ||||
184 | print "Please use 'update-perl-sax-parsers(8) to register this parser.'\n"; | ||||
185 | print "See /usr/share/doc/libxml-sax-perl/README.Debian.gz for more info.\n"; | ||||
186 | print "\n"; | ||||
187 | |||||
188 | return $class; # rest of the function is disabled on Debian. | ||||
189 | ### END DEBIAN MODIFICATION | ||||
190 | |||||
191 | # get directory from wherever XML::SAX is installed | ||||
192 | my $dir = $INC{'XML/SAX.pm'}; | ||||
193 | $dir = dirname($dir); | ||||
194 | |||||
195 | my $file = File::Spec->catfile($dir, "SAX", PARSER_DETAILS); | ||||
196 | chmod 0644, $file; | ||||
197 | unlink($file); | ||||
198 | |||||
199 | my $fh = gensym(); | ||||
200 | open($fh, ">$file") || | ||||
201 | die "Cannot write to $file: $!"; | ||||
202 | |||||
203 | foreach my $p (@$known_parsers) { | ||||
204 | print $fh "[$p->{Name}]\n"; | ||||
205 | foreach my $key (keys %{$p->{Features}}) { | ||||
206 | print $fh "$key = $p->{Features}{$key}\n"; | ||||
207 | } | ||||
208 | print $fh "\n"; | ||||
209 | } | ||||
210 | |||||
211 | print $fh "\n"; | ||||
212 | |||||
213 | close $fh; | ||||
214 | |||||
215 | return $class; | ||||
216 | } | ||||
217 | |||||
218 | sub save_parsers_debian { | ||||
219 | my $class = shift; | ||||
220 | my ($parser_module,$directory, $priority) = @_; | ||||
221 | |||||
222 | # add parser | ||||
223 | $known_parsers = []; | ||||
224 | $class->add_parser($parser_module); | ||||
225 | |||||
226 | # get parser's ParserDetails file | ||||
227 | my $file = $parser_module; | ||||
228 | $file = "${priority}-$file" if $priority != 0; | ||||
229 | $file = File::Spec->catfile($directory, $file); | ||||
230 | chmod 0644, $file; | ||||
231 | unlink($file); | ||||
232 | |||||
233 | my $fh = gensym(); | ||||
234 | open($fh, ">$file") || | ||||
235 | die "Cannot write to $file: $!"; | ||||
236 | |||||
237 | foreach my $p (@$known_parsers) { | ||||
238 | print $fh "[$p->{Name}]\n"; | ||||
239 | foreach my $key (keys %{$p->{Features}}) { | ||||
240 | print $fh "$key = $p->{Features}{$key}\n"; | ||||
241 | } | ||||
242 | print $fh "\n"; | ||||
243 | } | ||||
244 | |||||
245 | print $fh "\n"; | ||||
246 | |||||
247 | close $fh; | ||||
248 | |||||
249 | return $class; | ||||
250 | } | ||||
251 | |||||
252 | sub do_warn { | ||||
253 | my $class = shift; | ||||
254 | # Don't output warnings if running under Test::Harness | ||||
255 | warn(@_) unless $ENV{HARNESS_ACTIVE}; | ||||
256 | } | ||||
257 | |||||
258 | 1 | 8µs | 1; | ||
259 | __END__ | ||||
sub XML::SAX::CORE:match; # opcode | |||||
# spent 57µs within XML::SAX::CORE:open which was called:
# once (57µs+0s) by XML::SAX::load_parsers at line 61 | |||||
# spent 82µs within XML::SAX::CORE:readline which was called 32 times, avg 3µs/call:
# 32 times (82µs+0s) by XML::SAX::_parse_ini_file at line 78, avg 3µs/call | |||||
# spent 313µs within XML::SAX::CORE:subst which was called 93 times, avg 3µs/call:
# 31 times (222µs+0s) by XML::SAX::_parse_ini_file at line 82, avg 7µs/call
# 31 times (47µs+0s) by XML::SAX::_parse_ini_file at line 83, avg 2µs/call
# 31 times (44µs+0s) by XML::SAX::_parse_ini_file at line 85, avg 1µs/call |