Przeglądaj źródła

2004-08-30 Atsushi Enomoto <[email protected]>

	* XPathSequence.cs : fixed NodeIterator to get correct current node
	  from the input sequence. Now open MoveNext() again as public to
	  allow override by NodeIterator.

svn path=/trunk/mcs/; revision=33040
Atsushi Eno 21 lat temu
rodzic
commit
f0e7566f48

+ 6 - 0
mcs/class/System.XML/System.Xml.Query/ChangeLog

@@ -1,3 +1,9 @@
+2004-08-30  Atsushi Enomoto <[email protected]>
+
+	* XPathSequence.cs : fixed NodeIterator to get correct current node
+	  from the input sequence. Now open MoveNext() again as public to
+	  allow override by NodeIterator.
+
 2004-08-30  Atsushi Enomoto <[email protected]>
 
 	* XPath2Expression.cs : empty ExprSequence should not be allowed for

+ 16 - 5
mcs/class/System.XML/System.Xml.Query/XPathSequence.cs

@@ -81,11 +81,11 @@ namespace Mono.Xml.XPath2
 		public abstract XPathItem CurrentCore { get; }
 
 		// Returns 0 if not started, otherwise returns XPath positional integer.
-		public int Position {
+		public virtual int Position {
 			get { return position; }
 		}
 
-		public bool MoveNext ()
+		public virtual bool MoveNext ()
 		{
 			if (!MoveNextCore ())
 				return false;
@@ -585,11 +585,17 @@ namespace Mono.Xml.XPath2
 	{
 		XPathNavigator node;
 		XPathNavigator current;
+		bool emptyInput;
 
 		public NodeIterator (XPathSequence iter)
 			: base (iter.Context)
 		{
-//			XPathItem item = iter.Context.CurrentItem;
+			if (iter.Position == 0) {
+				if (!iter.MoveNext ()) {
+					emptyInput = true;
+					return;
+				}
+			}
 			XPathItem item = iter.Current;
 			node = item as XPathNavigator;
 			if (node == null)
@@ -600,15 +606,20 @@ namespace Mono.Xml.XPath2
 		internal NodeIterator (NodeIterator other, bool cloneFlag)
 			: base (other)
 		{
-			node = other.node.Clone ();
+			if (other.emptyInput)
+				emptyInput = true;
+			else
+				node = other.node.Clone ();
 		}
 
 		internal XPathNavigator Node {
 			get { return node; }
 		}
 
-		protected override bool MoveNextCore ()
+		public override bool MoveNext ()
 		{
+			if (emptyInput)
+				return false;
 			if (!base.MoveNext ())
 				return false;
 			current = null;