Author: atsushi
Date: 2005-03-11 06:33:30 -0500 (Fri, 11 Mar 2005)
New Revision: 41687
Modified:
trunk/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog
trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs
trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs
trunk/mcs/class/System.XML/System.Xml.XPath/ChangeLog
trunk/mcs/class/System.XML/System.Xml.XPath/DefaultContext.cs
trunk/mcs/class/System.XML/System.Xml.XPath/Expression.cs
trunk/mcs/class/System.XML/System.Xml.XPath/Iterator.cs
Log:
2004-03-11 Atsushi Enomoto <[EMAIL PROTECTED]>
* Expression.cs,
DefaultContext.cs : Removed unused NeedAbsoluteMatching.
Added Peer and Subtree (for "peer & subtree optimization. See:
http://idealliance.org/papers/dx_xmle04/papers/02-03-02/02-03-02.html
Fixed some ToString() that caused NullReferenceException.
* Iterator.cs : Predicate does not affect on RequireSorting.
Added SimpleSlashIterator for peer & subtree optimization.
Added PreserveWhitespace() consideration in BaseIterator.MoveNext().
* XslKey.cs : removed unused NeedAbsoluteMatching.
* XslFunctions.cs : Added Peer (for peer & subtree optimization).
Added some missing ToString() overrides.
Modified: trunk/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog 2005-03-11 11:18:08 UTC
(rev 41686)
+++ trunk/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog 2005-03-11 11:33:30 UTC
(rev 41687)
@@ -1,3 +1,9 @@
+2005-03-11 Atsushi Enomoto <[EMAIL PROTECTED]>
+
+ * XslKey.cs : removed unused NeedAbsoluteMatching.
+ * XslFunctions.cs : Added Peer (for peer & subtree optimization).
+ Added some missing ToString() overrides.
+
2005-03-09 Atsushi Enomoto <[EMAIL PROTECTED]>
* XslStylesheet.cs, XslCompiledContext.cs : Fixed PreserveWhitespace()
Modified: trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs 2005-03-11
11:18:08 UTC (rev 41686)
+++ trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs 2005-03-11
11:33:30 UTC (rev 41687)
@@ -193,6 +193,15 @@
{
return new SelfIterator ((iter.NamespaceManager as
XsltCompiledContext).Processor.CurrentNode, null);
}
+
+ internal override bool Peer {
+ get { return false; }
+ }
+
+ public override string ToString ()
+ {
+ return "current()";
+ }
}
class XsltDocument : XPathFunction
@@ -211,7 +220,11 @@
doc = c.Input.Clone ();
}
public override XPathResultType ReturnType { get { return
XPathResultType.NodeSet; }}
-
+
+ internal override bool Peer {
+ get { return arg0.Peer && (arg1 != null ? arg1.Peer :
true); }
+ }
+
public override object Evaluate (BaseIterator iter)
{
string baseUri = null;
@@ -279,6 +292,15 @@
return new SelfIterator (n, xsltContext);
}
+
+ public override string ToString ()
+ {
+ return String.Concat ("document(",
+ arg0.ToString (),
+ arg1 != null ? "," : String.Empty,
+ arg1 != null ? arg1.ToString () : String.Empty,
+ ")");
+ }
}
class XsltElementAvailable : XPathFunction
@@ -297,6 +319,10 @@
public override XPathResultType ReturnType { get { return
XPathResultType.Boolean; }}
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
QName name = XslNameUtil.FromString
(arg0.EvaluateString (iter), ctx);
@@ -346,6 +372,10 @@
}
}
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
+
+ internal override bool Peer {
+ get { return arg0.Peer && arg1.Peer && (arg2 != null ?
arg2.Peer : true); }
+ }
public override object Evaluate (BaseIterator iter)
{
@@ -380,6 +410,10 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.Boolean; }}
+
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
public override object Evaluate (BaseIterator iter)
{
@@ -451,6 +485,11 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
+
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
XPathNavigator n;
@@ -504,6 +543,10 @@
public Expression KeyName { get { return arg0; } }
public Expression Field { get { return arg1; } }
public override XPathResultType ReturnType { get { return
XPathResultType.NodeSet; }}
+
+ internal override bool Peer {
+ get { return arg0.Peer && arg1.Peer; }
+ }
public override object Evaluate (BaseIterator iter)
{
@@ -580,6 +623,11 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
+
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
QName name = XslNameUtil.FromString
(arg0.EvaluateString (iter), ctx);
@@ -609,6 +657,11 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
+
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
IHasXmlNode xn = iter.Current as IHasXmlNode;
@@ -645,6 +698,10 @@
}
}
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
XsltCompiledContext ctx = iter.NamespaceManager as
XsltCompiledContext;
Modified: trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs 2005-03-11 11:18:08 UTC
(rev 41686)
+++ trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs 2005-03-11 11:33:30 UTC
(rev 41687)
@@ -63,11 +63,6 @@
get { return expr.EvaluatedNodeType; }
}
- internal override bool NeedAbsoluteMatching {
- // This must be evaluated at any point.
- get { return true; }
- }
-
public override XPathResultType ReturnType {
get { return expr.ReturnType; }
}
@@ -120,11 +115,7 @@
{
XPathNavigator nav = doc.Clone ();
nav.MoveToRoot ();
-// Expression expr = ((ExprKeyContainer)
MatchPattern.ExpressionNode).BodyExpression;
-// if (expr.NeedAbsoluteMatching)
-// CollectAbsoluteMatchNodes (nav);
-// else
- CollectRelativeMatchNodes (nav);
+ CollectRelativeMatchNodes (nav);
}
private void CollectAbsoluteMatchNodes (XPathNavigator nav)
Modified: trunk/mcs/class/System.XML/System.Xml.XPath/ChangeLog
===================================================================
--- trunk/mcs/class/System.XML/System.Xml.XPath/ChangeLog 2005-03-11
11:18:08 UTC (rev 41686)
+++ trunk/mcs/class/System.XML/System.Xml.XPath/ChangeLog 2005-03-11
11:33:30 UTC (rev 41687)
@@ -1,3 +1,16 @@
+2004-03-11 Atsushi Enomoto <[EMAIL PROTECTED]>
+
+ * Expression.cs,
+ DefaultContext.cs : Removed unused NeedAbsoluteMatching.
+ Added Peer and Subtree (for "peer & subtree optimization. See:
+ http://idealliance.org/papers/dx_xmle04/papers/02-03-02/02-03-02.html
+ Fixed some ToString() that caused NullReferenceException.
+
+ * Iterator.cs : Predicate does not affect on RequireSorting.
+ Added SimpleSlashIterator for peer & subtree optimization.
+
+ Added PreserveWhitespace() consideration in BaseIterator.MoveNext().
+
2004-03-09 Atsushi Enomoto <[EMAIL PROTECTED]>
* Expression.cs,
Modified: trunk/mcs/class/System.XML/System.Xml.XPath/DefaultContext.cs
===================================================================
--- trunk/mcs/class/System.XML/System.Xml.XPath/DefaultContext.cs
2005-03-11 11:18:08 UTC (rev 41686)
+++ trunk/mcs/class/System.XML/System.Xml.XPath/DefaultContext.cs
2005-03-11 11:33:30 UTC (rev 41687)
@@ -213,7 +213,11 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.Number; }}
-
+
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
return (double) arg0.EvaluateNodeSet (iter).Count;
@@ -251,6 +255,10 @@
private static char [] rgchWhitespace = {' ', '\t', '\r', '\n'};
public override XPathResultType ReturnType { get { return
XPathResultType.NodeSet; }}
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
String strArgs;
@@ -297,6 +305,10 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
+
+ internal override bool Peer {
+ get { return arg0 != null ? arg0.Peer : true; }
+ }
public override object Evaluate (BaseIterator iter)
{
@@ -328,6 +340,10 @@
throw new XPathException
("namespace-uri takes 1 or zero args");
}
}
+
+ internal override bool Peer {
+ get { return arg0 != null ? arg0.Peer : true; }
+ }
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
@@ -363,6 +379,10 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
+
+ internal override bool Peer {
+ get { return arg0 != null ? arg0.Peer : true; }
+ }
public override object Evaluate (BaseIterator iter)
{
@@ -377,7 +397,9 @@
public override string ToString ()
{
- return "name(" + arg0.ToString () + ")";
+ return String.Concat ("name(",
+ arg0 != null ? arg0.ToString () : String.Empty,
+ ")");
}
}
@@ -391,12 +413,16 @@
if (args != null) {
arg0 = args.Arg;
if (args.Tail != null)
- throw new XPathException ("boolean
takes 1 or zero args");
+ throw new XPathException ("string takes
1 or zero args");
}
}
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
+ internal override bool Peer {
+ get { return arg0 != null ? arg0.Peer : true; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
if (arg0 == null)
@@ -424,6 +450,15 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
+
+ internal override bool Peer {
+ get {
+ for (int i = 0; i < rgs.Count; i++)
+ if (!((Expression) rgs [i]).Peer)
+ return false;
+ return true;
+ }
+ }
public override object Evaluate (BaseIterator iter)
{
@@ -465,6 +500,10 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.Boolean; }}
+
+ internal override bool Peer {
+ get { return arg0.Peer && arg1.Peer; }
+ }
public override object Evaluate (BaseIterator iter)
{
@@ -492,6 +531,10 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.Boolean; }}
+
+ internal override bool Peer {
+ get { return arg0.Peer && arg1.Peer; }
+ }
public override object Evaluate (BaseIterator iter)
{
@@ -519,6 +562,10 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
+
+ internal override bool Peer {
+ get { return arg0.Peer && arg1.Peer; }
+ }
public override object Evaluate (BaseIterator iter)
{
@@ -551,6 +598,10 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
+
+ internal override bool Peer {
+ get { return arg0.Peer && arg1.Peer; }
+ }
public override object Evaluate (BaseIterator iter)
{
@@ -585,6 +636,10 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
+
+ internal override bool Peer {
+ get { return arg0.Peer && arg1.Peer && (arg2 != null ?
arg2.Peer : true); }
+ }
public override object Evaluate (BaseIterator iter)
{
@@ -642,6 +697,10 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.Number; }}
+
+ internal override bool Peer {
+ get { return arg0 != null ? arg0.Peer : true; }
+ }
public override object Evaluate (BaseIterator iter)
{
@@ -676,6 +735,10 @@
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
+ internal override bool Peer {
+ get { return arg0 !=null ? arg0.Peer : true; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
string str;
@@ -730,6 +793,10 @@
}
public override XPathResultType ReturnType { get { return
XPathResultType.String; }}
+
+ internal override bool Peer {
+ get { return arg0.Peer && arg1.Peer && arg2.Peer; }
+ }
public override object Evaluate (BaseIterator iter)
{
@@ -783,6 +850,10 @@
public override XPathResultType ReturnType { get { return
XPathResultType.Boolean; }}
+ internal override bool Peer {
+ get { return arg0 != null ? arg0.Peer : true; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
if (arg0 == null)
@@ -810,6 +881,10 @@
public override XPathResultType ReturnType { get { return
XPathResultType.Boolean; }}
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
return !arg0.EvaluateBoolean (iter);
@@ -878,6 +953,10 @@
public override XPathResultType ReturnType { get { return
XPathResultType.Boolean; }}
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
string lang = arg0.EvaluateString (iter).ToLower
(CultureInfo.InvariantCulture);
@@ -908,6 +987,10 @@
public override XPathResultType ReturnType { get { return
XPathResultType.Number; }}
+ internal override bool Peer {
+ get { return arg0 != null ? arg0.Peer : true; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
if (arg0 == null)
@@ -935,6 +1018,10 @@
public override XPathResultType ReturnType { get { return
XPathResultType.Number; }}
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
XPathNodeIterator itr = arg0.EvaluateNodeSet (iter);
@@ -966,6 +1053,10 @@
public override XPathResultType ReturnType { get { return
XPathResultType.Number; }}
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
return Math.Floor (arg0.EvaluateNumber (iter));
@@ -991,6 +1082,10 @@
public override XPathResultType ReturnType { get { return
XPathResultType.Number; }}
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
return Math.Ceiling (arg0.EvaluateNumber (iter));
@@ -1016,6 +1111,10 @@
public override XPathResultType ReturnType { get { return
XPathResultType.Number; }}
+ internal override bool Peer {
+ get { return arg0.Peer; }
+ }
+
public override object Evaluate (BaseIterator iter)
{
double arg = arg0.EvaluateNumber (iter);
Modified: trunk/mcs/class/System.XML/System.Xml.XPath/Expression.cs
===================================================================
--- trunk/mcs/class/System.XML/System.Xml.XPath/Expression.cs 2005-03-11
11:18:08 UTC (rev 41686)
+++ trunk/mcs/class/System.XML/System.Xml.XPath/Expression.cs 2005-03-11
11:33:30 UTC (rev 41687)
@@ -431,11 +431,11 @@
get { return XPathNodeType.All; }
}
- internal virtual bool NeedAbsoluteMatching {
+ internal virtual bool IsPositional {
get { return false; }
}
- internal virtual bool IsPositional {
+ internal virtual bool Peer {
get { return false; }
}
@@ -580,6 +580,10 @@
internal override bool IsPositional {
get { return _left.IsPositional || _right.IsPositional;
}
}
+
+ internal override bool Peer {
+ get { return _left.Peer && _right.Peer; }
+ }
}
internal abstract class ExprBoolean : ExprBinary
@@ -940,11 +944,13 @@
internal abstract class NodeSet : Expression
{
public override XPathResultType ReturnType { get { return
XPathResultType.NodeSet; }}
+
+ internal abstract bool Subtree { get; }
}
internal class ExprUNION : NodeSet
{
- public readonly Expression left, right;
+ internal readonly Expression left, right;
public ExprUNION (Expression left, Expression right)
{
this.left = left;
@@ -958,10 +964,6 @@
return new UnionIterator (iter, iterLeft, iterRight);
}
- internal override bool NeedAbsoluteMatching {
- get { return left.NeedAbsoluteMatching ||
right.NeedAbsoluteMatching; }
- }
-
internal override XPathNodeType EvaluatedNodeType {
get { return left.EvaluatedNodeType ==
right.EvaluatedNodeType ? left.EvaluatedNodeType : XPathNodeType.All; }
}
@@ -969,6 +971,18 @@
internal override bool IsPositional {
get { return left.IsPositional || right.IsPositional; }
}
+
+ internal override bool Peer {
+ get { return left.Peer && right.Peer; }
+ }
+
+ internal override bool Subtree {
+ get {
+ NodeSet nl = left as NodeSet;
+ NodeSet nr = right as NodeSet;
+ return nl != null && nr != null && nl.Subtree
&& nr.Subtree;
+ }
+ }
}
internal class ExprSLASH : NodeSet
@@ -984,15 +998,13 @@
public override object Evaluate (BaseIterator iter)
{
BaseIterator iterLeft = left.EvaluateNodeSet (iter);
- return new SlashIterator (iterLeft, right,
left.RequireSorting || right.RequireSorting);
+ if (left.Peer && right.Subtree && !RequireSorting)
+ return new SimpleSlashIterator (iterLeft,
right);
+ return new SlashIterator (iterLeft, right,
RequireSorting);
}
public override bool RequireSorting { get { return
left.RequireSorting || right.RequireSorting; } }
- internal override bool NeedAbsoluteMatching {
- get { return true; }
- }
-
internal override XPathNodeType EvaluatedNodeType {
get { return right.EvaluatedNodeType; }
}
@@ -1000,6 +1012,17 @@
internal override bool IsPositional {
get { return left.IsPositional || right.IsPositional; }
}
+
+ internal override bool Peer {
+ get { return left.Peer && right.Peer; }
+ }
+
+ internal override bool Subtree {
+ get {
+ NodeSet n = left as NodeSet;
+ return n != null && n.Subtree && right.Subtree;
+ }
+ }
}
internal class ExprSLASH2 : NodeSet {
@@ -1029,10 +1052,6 @@
public override bool RequireSorting { get { return
left.RequireSorting || right.RequireSorting; } }
- internal override bool NeedAbsoluteMatching {
- get { return true; }
- }
-
internal override XPathNodeType EvaluatedNodeType {
get { return right.EvaluatedNodeType; }
}
@@ -1040,6 +1059,17 @@
internal override bool IsPositional {
get { return left.IsPositional || right.IsPositional; }
}
+
+ internal override bool Peer {
+ get { return false; }
+ }
+
+ internal override bool Subtree {
+ get {
+ NodeSet n = left as NodeSet;
+ return n != null && n.Subtree && right.Subtree;
+ }
+ }
}
internal class ExprRoot : NodeSet
@@ -1052,13 +1082,17 @@
return new SelfIterator (navRoot,
iter.NamespaceManager);
}
- internal override bool NeedAbsoluteMatching {
- get { return false; }
- }
-
internal override XPathNodeType EvaluatedNodeType {
get { return XPathNodeType.Root; }
}
+
+ internal override bool Peer {
+ get { return true; }
+ }
+
+ internal override bool Subtree {
+ get { return false; }
+ }
}
internal enum Axes
@@ -1205,6 +1239,38 @@
}
+ internal override bool Peer {
+ get {
+ switch (_axis.Axis) {
+ case Axes.Ancestor:
+ case Axes.AncestorOrSelf:
+ case Axes.DescendantOrSelf:
+ case Axes.Descendant:
+ case Axes.Preceding:
+ case Axes.Following:
+ return false;
+ default:
+ return true;
+ }
+ }
+ }
+
+ internal override bool Subtree {
+ get {
+ switch (_axis.Axis) {
+ case Axes.Parent:
+ case Axes.Ancestor:
+ case Axes.AncestorOrSelf:
+ case Axes.Preceding:
+ case Axes.Following:
+ return false;
+ default:
+ return true;
+ }
+ }
+
+ }
+
internal override XPathNodeType EvaluatedNodeType {
get { return _axis.NodeType; }
}
@@ -1384,10 +1450,6 @@
return new PredicateIterator (iterExpr, pred);
}
- internal override bool NeedAbsoluteMatching {
- get { return expr.NeedAbsoluteMatching; }
- }
-
internal override XPathNodeType EvaluatedNodeType {
get { return expr.EvaluatedNodeType; }
}
@@ -1399,6 +1461,17 @@
return expr.IsPositional || pred.IsPositional;
}
}
+
+ internal override bool Peer {
+ get { return expr.Peer && pred.Peer; }
+ }
+
+ internal override bool Subtree {
+ get {
+ NodeSet n = expr as NodeSet;
+ return n != null && n.Subtree;
+ }
+ }
}
internal class ExprNumber : Expression
@@ -1486,6 +1559,10 @@
return iterResult is BaseIterator ? iterResult
: new WrapperIterator (iterResult, iter.NamespaceManager);
return objResult;
}
+
+ internal override bool Peer {
+ get { return false; }
+ }
}
internal class ExprParens : Expression
@@ -1513,10 +1590,6 @@
return o;
}
- internal override bool NeedAbsoluteMatching {
- get { return _expr.NeedAbsoluteMatching; }
- }
-
internal override XPathNodeType EvaluatedNodeType {
get { return _expr.EvaluatedNodeType; }
}
@@ -1524,6 +1597,10 @@
internal override bool IsPositional {
get { return _expr.IsPositional; }
}
+
+ internal override bool Peer {
+ get { return _expr.Peer; }
+ }
}
internal class FunctionArguments
@@ -1671,5 +1748,9 @@
}
return func.Invoke (context, rgArgs, iter.Current);
}
+
+ internal override bool Peer {
+ get { return false; }
+ }
}
}
Modified: trunk/mcs/class/System.XML/System.Xml.XPath/Iterator.cs
===================================================================
--- trunk/mcs/class/System.XML/System.Xml.XPath/Iterator.cs 2005-03-11
11:18:08 UTC (rev 41686)
+++ trunk/mcs/class/System.XML/System.Xml.XPath/Iterator.cs 2005-03-11
11:33:30 UTC (rev 41687)
@@ -91,6 +91,11 @@
if (!MoveNextCore ())
return false;
position++;
+ if (Current != null &&
+ Current.NodeType == XPathNodeType.Whitespace &&
+ _nsm is XsltContext &&
+ !((XsltContext) _nsm).PreserveWhitespace
(Current))
+ return MoveNext ();
return true;
}
@@ -831,6 +836,54 @@
public override bool RequireSorting { get { return
_iter.RequireSorting; } }
}
+ internal class SimpleSlashIterator : BaseIterator
+ {
+ private NodeSet _expr;
+ private BaseIterator _left, _right;
+ private XPathNavigator _current;
+
+ public SimpleSlashIterator (BaseIterator left, NodeSet expr)
+ : base (left.NamespaceManager)
+ {
+ this._left = left;
+ this._expr = expr;
+ }
+
+ private SimpleSlashIterator (SimpleSlashIterator other)
+ : base (other)
+ {
+ _expr = other._expr;
+ _left = (BaseIterator) other._left.Clone ();
+ if (other._right != null)
+ _right = (BaseIterator) other._right.Clone ();
+ }
+
+ public override XPathNodeIterator Clone () { return new
SimpleSlashIterator (this); }
+
+ public override bool MoveNextCore ()
+ {
+ while (_right == null || !_right.MoveNext ()) {
+ if (!_left.MoveNext ())
+ return false;
+ _right = _expr.EvaluateNodeSet (_left);
+ }
+ if (_current == null)
+ _current = _right.Current.Clone ();
+ else
+ _current.MoveTo (_right.Current);
+ return true;
+ }
+
+ public override XPathNavigator Current {
+ get { return _current; }
+ }
+
+ public override bool RequireSorting {
+ // It always does not need to be sorted.
+ get { return false; }
+ }
+ }
+
internal class SlashIterator : BaseIterator
{
private BaseIterator _iterLeft;
@@ -1056,7 +1109,7 @@
get { return _iter.ReverseAxis; }
}
- public override bool RequireSorting { get { return
_iter.RequireSorting || _pred.RequireSorting; } }
+ public override bool RequireSorting { get { return
_iter.RequireSorting; } }
}
internal class ListIterator : BaseIterator
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches