Author: kostat
Date: 2008-02-10 07:27:49 -0500 (Sun, 10 Feb 2008)
New Revision: 95369

Modified:
   trunk/mcs/class/System.XML/System.Xml.XPath/ChangeLog
   trunk/mcs/class/System.XML/System.Xml.XPath/Iterator.cs
   trunk/mcs/class/System.XML/Test/System.Xml.XPath/SelectNodesTests.cs
Log:
prevent endless recursion in AncestorIterator while collecting results

Modified: trunk/mcs/class/System.XML/System.Xml.XPath/ChangeLog
===================================================================
--- trunk/mcs/class/System.XML/System.Xml.XPath/ChangeLog       2008-02-10 
12:13:23 UTC (rev 95368)
+++ trunk/mcs/class/System.XML/System.Xml.XPath/ChangeLog       2008-02-10 
12:27:49 UTC (rev 95369)
@@ -1,3 +1,8 @@
+2008-01-10  Konstantin Triger <[EMAIL PROTECTED]>
+
+       * Iterator.cs: prevent endless recursion in AncestorIterator
+               while collecting results.
+
 2008-01-12  Sebastien Pouliot  <[EMAIL PROTECTED]>
 
        * DefaultContext.cs: Fix direct comparison with NaN. Found by 

Modified: trunk/mcs/class/System.XML/System.Xml.XPath/Iterator.cs
===================================================================
--- trunk/mcs/class/System.XML/System.Xml.XPath/Iterator.cs     2008-02-10 
12:13:23 UTC (rev 95368)
+++ trunk/mcs/class/System.XML/System.Xml.XPath/Iterator.cs     2008-02-10 
12:27:49 UTC (rev 95369)
@@ -367,27 +367,16 @@
                {
                        navigators = new ArrayList ();
 
-                       XPathNavigator ancestors = startPosition.Clone ();
-                       if (!ancestors.MoveToParent ())
-                               return;
-                       while (ancestors.NodeType != XPathNodeType.Root) {
+                       XPathNavigator ancestors = startPosition.Clone ();
+                       while (ancestors.NodeType != XPathNodeType.Root && 
ancestors.MoveToParent ())
                                navigators.Add (ancestors.Clone ());
-                               ancestors.MoveToParent ();
-                       }
                        currentPosition = navigators.Count;
                }
 
                public override bool MoveNextCore ()
                {
-                       if (navigators == null) {
+                       if (navigators == null)
                                CollectResults ();
-                               if (startPosition.NodeType != 
XPathNodeType.Root) {
-                                       // First time it returns Root
-                                       _nav.MoveToRoot ();
-                                       Current.MoveTo (_nav);
-                                       return true;
-                               }
-                       }
                        if (currentPosition == 0)
                                return false;
                        _nav.MoveTo ((XPathNavigator) navigators 
[--currentPosition]);

Modified: trunk/mcs/class/System.XML/Test/System.Xml.XPath/SelectNodesTests.cs
===================================================================
--- trunk/mcs/class/System.XML/Test/System.Xml.XPath/SelectNodesTests.cs        
2008-02-10 12:13:23 UTC (rev 95368)
+++ trunk/mcs/class/System.XML/Test/System.Xml.XPath/SelectNodesTests.cs        
2008-02-10 12:27:49 UTC (rev 95369)
@@ -276,6 +276,22 @@
                        AssertEquals ("hoge", nl [1].LocalName);
                        AssertEquals ("xml", nl [2].LocalName);
                        AssertEquals (3, nl.Count);
+               }
+
+               [Test]
+               public void AncestorAxis () {
+                       XmlDocument doc = new XmlDocument ();
+                       doc.LoadXml ("<foo><bar><baz><bax 
/></baz></bar></foo>");
+
+                       XmlNode bar = doc.GetElementsByTagName ("bar") [0];
+                       XmlElement barClone = (XmlElement) bar.CloneNode (true);
+                       XmlNodeList baxs = barClone.GetElementsByTagName 
("bax");
+
+                       XmlNode bax = baxs [0];
+                       XmlNodeList ans = bax.SelectNodes ("ancestor::*");
+                       AssertEquals (2, ans.Count);
+                       AssertEquals ("bar", ans [0].Name);
+                       AssertEquals ("baz", ans [1].Name);
                }
        }
 }

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to