| line |
true |
false |
branch |
|
66
|
0 |
5 |
if $Tree::XPathEngine::DEBUG |
|
91
|
2 |
1 |
if (grep {"$node" eq "$_";} @nodes) |
|
101
|
12 |
1 |
if ($results->isa('Tree::XPathEngine::NodeSet')) { } |
|
114
|
1 |
2 |
if ($results->isa('Tree::XPathEngine::NodeSet')) { } |
|
|
0 |
2 |
elsif ($results->isa('Tree::XPathEngine::Node')) { } |
|
129
|
102 |
22 |
$results ? : |
|
136
|
1 |
1 |
scalar @nodeset ? : |
|
162
|
18 |
130 |
if ($Tree::XPathEngine::CACHE{$path}) |
|
170
|
1 |
125 |
if ($$self{'_tokpos'} < scalar @$tokens) |
|
177
|
0 |
125 |
if $Tree::XPathEngine::DEBUG |
|
189
|
0 |
130 |
if $Tree::XPathEngine::DEBUG |
|
197
|
9 |
1309 |
if ($expected eq 'RE' and $path =~ /\G\s*($Tree::XPathEngine::REGEXP_RE $Tree::XPathEngine::REGEXP_MOD_RE?)\s*/cgsx) { } |
|
|
1179 |
130 |
elsif ($path =~ m{\G
\s* # ignore all whitespace
( # tokens
$Tree::XPathEngine::LITERAL| # literal string
$Tree::XPathEngine::NUMBER_RE| # digits
\.\.| # parent
\.| # current
($Tree::XPathEngine::AXIS_NAME)?$Tree::XPathEngine::NODE_TYPE| # node type test (probably useless in this context)
\@($$self{'NAME'}|$Tree::XPathEngine::WILD)| # attribute
\$$$self{'NAME'}| # variable reference
($Tree::XPathEngine::AXIS_NAME)?($$self{'NAME'}|$Tree::XPathEngine::WILD)| # NAME,NodeType,Axis::Test
\!=|<=|\-|>=|//|and|or|mod|div| # multi-char seps
=~|\!~| # regexp matching (not in the XPath spec)
[,\+=\|<>/\(\[\]\)]| # single char seps
(?
|
|
221
|
9 |
1170 |
$token =~ /^[=!]~$/ ? : |
|
226
|
1059 |
129 |
if (length $token) |
|
228
|
0 |
1059 |
if $Tree::XPathEngine::DEBUG |
|
233
|
1 |
129 |
if (pos $path < length $path) |
|
259
|
1250 |
4823 |
unless $$self{'_tokpos'} < @$tokens |
|
265
|
876 |
3947 |
if ($$tokens[$$self{'_tokpos'}] =~ /^$match$/) { } |
|
271
|
1 |
3946 |
if ($fatal) { } |
|
283
|
0 |
301 |
if $Tree::XPathEngine::DEBUG |
|
291
|
0 |
301 |
if $Tree::XPathEngine::DEBUG |
|
311
|
0 |
302 |
if $Tree::XPathEngine::DEBUG |
|
331
|
0 |
304 |
if $Tree::XPathEngine::DEBUG |
|
352
|
0 |
313 |
if $Tree::XPathEngine::DEBUG |
|
372
|
0 |
384 |
if $Tree::XPathEngine::DEBUG |
|
392
|
0 |
402 |
if $Tree::XPathEngine::DEBUG |
|
412
|
0 |
414 |
if $Tree::XPathEngine::DEBUG |
|
432
|
0 |
420 |
if $Tree::XPathEngine::DEBUG |
|
434
|
2 |
418 |
if (_match($self, $tokens, '-')) { } |
|
449
|
0 |
418 |
if $Tree::XPathEngine::DEBUG |
|
469
|
0 |
420 |
if $Tree::XPathEngine::DEBUG |
|
482
|
113 |
307 |
if ($test =~ m[^(//?|\.\.?)$]) { } |
|
|
42 |
265 |
elsif (_is_step($self, $tokens)) { } |
|
495
|
0 |
264 |
if (_match($self, $tokens, '//?')) |
|
498
|
0 |
0 |
if ($$self{'_curr_match'} eq '//') |
|
515
|
0 |
265 |
if $Tree::XPathEngine::DEBUG |
|
530
|
0 |
265 |
if $Tree::XPathEngine::DEBUG |
|
534
|
81 |
184 |
if (_match($self, $tokens, $Tree::XPathEngine::LITERAL)) { } |
|
|
9 |
175 |
elsif (_match($self, $tokens, "$Tree::XPathEngine::REGEXP_RE$Tree::XPathEngine::REGEXP_MOD_RE?")) { } |
|
|
103 |
72 |
elsif (_match($self, $tokens, $Tree::XPathEngine::NUMBER_RE)) { } |
|
|
25 |
47 |
elsif (_match($self, $tokens, '\\(')) { } |
|
|
0 |
47 |
elsif (_match($self, $tokens, "\\\$$$self{'NAME'}")) { } |
|
|
46 |
1 |
elsif (_match($self, $tokens, $$self{'NAME'})) { } |
|
544
|
0 |
9 |
if ($mod) |
|
584
|
0 |
46 |
if $Tree::XPathEngine::DEBUG |
|
588
|
13 |
33 |
if ($$tokens[$$self{'_tokpos'}] eq ')') |
|
603
|
0 |
155 |
if $Tree::XPathEngine::DEBUG |
|
607
|
18 |
137 |
if (_match($self, $tokens, '/')) { } |
|
|
69 |
68 |
elsif (_match($self, $tokens, '//')) { } |
|
609
|
0 |
18 |
if $Tree::XPathEngine::DEBUG |
|
611
|
18 |
0 |
if (_is_step($self, $tokens)) |
|
612
|
0 |
18 |
if $Tree::XPathEngine::DEBUG |
|
620
|
62 |
7 |
if (not $optimised) { } |
|
639
|
0 |
72 |
if $Tree::XPathEngine::DEBUG |
|
644
|
61 |
11 |
if ($$tokens[$tokpos + 1] and $$tokens[$tokpos + 1] eq '[') { } |
|
|
0 |
11 |
elsif ($$tokens[$tokpos] =~ /^\.\.?$/) { } |
|
653
|
0 |
11 |
if $Tree::XPathEngine::DEBUG |
|
655
|
4 |
7 |
if ($$step{'axis'} ne 'child') |
|
671
|
0 |
155 |
if $Tree::XPathEngine::DEBUG |
|
677
|
3 |
42 |
if ($$self{'_curr_match'} eq '//') |
|
679
|
3 |
0 |
if (not $optimised) { } |
|
688
|
0 |
44 |
if (@steps > 1 and $steps[-1]{'axis'} eq 'self' and $steps[-1]{'test'} == 5) |
|
701
|
0 |
211 |
if $Tree::XPathEngine::DEBUG |
|
703
|
32 |
179 |
if (_match($self, $tokens, '\\.')) { } |
|
|
3 |
176 |
elsif (_match($self, $tokens, '\\.\\.')) { } |
|
715
|
0 |
176 |
if $Tree::XPathEngine::DEBUG |
|
718
|
82 |
94 |
if ($token =~ /^\@($$self{'NAME'}|$Tree::XPathEngine::WILD)$/) { } |
|
|
15 |
79 |
elsif ($token =~ /^$Tree::XPathEngine::WILD$/) { } |
|
|
66 |
13 |
elsif ($token =~ /^$$self{'NAME'}$/) { } |
|
|
0 |
13 |
elsif ($token eq 'text()') { } |
|
|
0 |
13 |
elsif ($token eq 'node()') { } |
|
|
12 |
1 |
elsif ($token =~ /^($Tree::XPathEngine::AXIS_NAME)($$self{'NAME'}|$Tree::XPathEngine::WILD|$Tree::XPathEngine::NODE_TYPE)$/) { } |
|
720
|
10 |
72 |
if ($token eq '@*') { } |
|
|
72 |
0 |
elsif ($token =~ /^\@($$self{'NAME'})$/) { } |
|
759
|
10 |
2 |
if ($token =~ /^$Tree::XPathEngine::WILD$/) { } |
|
|
2 |
0 |
elsif ($token =~ /^$$self{'NAME'}$/) { } |
|
|
0 |
0 |
elsif ($token eq 'text()') { } |
|
|
0 |
0 |
elsif ($token eq 'node()') { } |
|
760
|
0 |
10 |
$axis eq 'attribute' ? : |
|
768
|
0 |
2 |
$axis eq 'attribute' ? : |
|
805
|
0 |
325 |
unless defined $token |
|
807
|
0 |
325 |
if $Tree::XPathEngine::DEBUG |
|
811
|
60 |
265 |
if ($token eq 'processing-instruction' or $token =~ /^\@($$self{'NAME'}|$Tree::XPathEngine::WILD)$/ or $token =~ /^($$self{'NAME'}|$Tree::XPathEngine::WILD)$/ and ($$tokens[$$self{'_tokpos'} + 1] || '') ne '(' or $token =~ /^$Tree::XPathEngine::NODE_TYPE$/ or $token =~ /^$Tree::XPathEngine::AXIS_NAME($$self{'NAME'}|$Tree::XPathEngine::WILD|$Tree::XPathEngine::NODE_TYPE)$/) { } |
|
820
|
0 |
265 |
if $Tree::XPathEngine::DEBUG |