Hash :
c2f4da1a
Author :
Date :
2017-05-21T22:08:50
Improve XPath predicate and filter evaluation Consolidate code paths evaluating XPath predicates and filters. Don't push context node on stack when evaluating predicates. I have no idea why this was done. It seems completely useless and trying to pop the context node from a corrupted stack has already caused security issues. Filter nodesets in-place and don't create node sets with NULL gaps which allows to simplify merging a great deal. Simply move matched nodes backward and create a compact node set. Merge xmlXPathCompOpEvalPositionalPredicate into xmlXPathCompOpEvalPredicate.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
========================
Expression: /child::EXAMPLE
Object is a Node Set :
Set contains 1 nodes:
1 ELEMENT EXAMPLE
ATTRIBUTE prop1
TEXT
content=gnome is great
ATTRIBUTE prop2
TEXT
content=& linux too
========================
Expression: /child::*
Object is a Node Set :
Set contains 1 nodes:
1 ELEMENT EXAMPLE
ATTRIBUTE prop1
TEXT
content=gnome is great
ATTRIBUTE prop2
TEXT
content=& linux too
========================
Expression: /child::EXAMPLE/child::head
Object is a Node Set :
Set contains 1 nodes:
1 ELEMENT head
========================
Expression: /child::EXAMPLE/child::*
Object is a Node Set :
Set contains 6 nodes:
1 ELEMENT head
2 ELEMENT chapter
ATTRIBUTE id
TEXT
content=chapter1
3 ELEMENT chapter
ATTRIBUTE id
TEXT
content=chapter2
4 ELEMENT chapter
ATTRIBUTE id
TEXT
content=chapter3
5 ELEMENT chapter
ATTRIBUTE id
TEXT
content=chapter4
6 ELEMENT chapter
ATTRIBUTE id
TEXT
content=chapter5
========================
Expression: /child::EXAMPLE/child::head/child::title
Object is a Node Set :
Set contains 1 nodes:
1 ELEMENT title
========================
Expression: /child::EXAMPLE/child::head/child::title/child::text()
Object is a Node Set :
Set contains 1 nodes:
1 TEXT
content=Welcome to Gnome
========================
Expression: /child::EXAMPLE/child::head/node()
Object is a Node Set :
Set contains 3 nodes:
1 TEXT
content=
2 ELEMENT title
3 TEXT
content=
========================
Expression: /descendant::title
Object is a Node Set :
Set contains 6 nodes:
1 ELEMENT title
2 ELEMENT title
3 ELEMENT title
4 ELEMENT title
5 ELEMENT title
6 ELEMENT title
========================
Expression: /descendant::p/ancestor::chapter
Object is a Node Set :
Set contains 5 nodes:
1 ELEMENT chapter
ATTRIBUTE id
TEXT
content=chapter1
2 ELEMENT chapter
ATTRIBUTE id
TEXT
content=chapter2
3 ELEMENT chapter
ATTRIBUTE id
TEXT
content=chapter3
4 ELEMENT chapter
ATTRIBUTE id
TEXT
content=chapter4
5 ELEMENT chapter
ATTRIBUTE id
TEXT
content=chapter5
========================
Expression: //p[1]
Object is a Node Set :
Set contains 5 nodes:
1 ELEMENT p
2 ELEMENT p
3 ELEMENT p
4 ELEMENT p
5 ELEMENT p
========================
Expression: //p[0 div 0]
Object is a Node Set :
Set contains 0 nodes:
========================
Expression: //p[100000000000000000000]
Object is a Node Set :
Set contains 0 nodes:
========================
Expression: //p[-100000000000000000000]
Object is a Node Set :
Set contains 0 nodes:
========================
Expression: //chapter[true()][position() mod 2 = 1][true()][2]
Object is a Node Set :
Set contains 1 nodes:
1 ELEMENT chapter
ATTRIBUTE id
TEXT
content=chapter3
========================
Expression: //chapter[true()][2][true()]
Object is a Node Set :
Set contains 1 nodes:
1 ELEMENT chapter
ATTRIBUTE id
TEXT
content=chapter2
========================
Expression: //node()[false()]
Object is a Node Set :
Set contains 0 nodes:
========================
Expression: (//node())[false()]
Object is a Node Set :
Set contains 0 nodes: