merge XPath optimization branch. About 15% faster/less memory use so
authorAtsushi Eno <atsushieno@gmail.com>
Thu, 13 Nov 2008 13:05:44 +0000 (13:05 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Thu, 13 Nov 2008 13:05:44 +0000 (13:05 -0000)
far.

svn path=/trunk/mcs/; revision=118710

22 files changed:
mcs/class/System.XML/Mono.Xml.Xsl.Operations/ChangeLog
mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslCopy.cs
mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslVariable.cs
mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog
mcs/class/System.XML/Mono.Xml.Xsl/GenericOutputter.cs
mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs
mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs
mcs/class/System.XML/Mono.Xml.Xsl/XslTransformProcessor.cs
mcs/class/System.XML/System.Xml.XPath/ChangeLog
mcs/class/System.XML/System.Xml.XPath/DefaultContext.cs
mcs/class/System.XML/System.Xml.XPath/Expression.cs
mcs/class/System.XML/System.Xml.XPath/Iterator.cs
mcs/class/System.XML/System.Xml.XPath/XPathExpression.cs
mcs/class/System.XML/System.Xml.XPath/XPathNavigator.cs
mcs/class/System.XML/System.Xml/ChangeLog
mcs/class/System.XML/System.Xml/XmlDocumentNavigator.cs
mcs/class/System.XML/Test/System.Xml.XPath/ChangeLog
mcs/class/System.XML/Test/System.Xml.XPath/XPathNavigatorEvaluateTests.cs
mcs/class/System.XML/Test/System.Xml.Xsl/ChangeLog
mcs/class/System.XML/Test/System.Xml.Xsl/XslTransformTests.cs
mcs/class/System.XML/Test/System.Xml.Xsl/standalone_tests/ChangeLog
mcs/class/System.XML/Test/System.Xml.Xsl/standalone_tests/Makefile

index 6c8d534a5a138ddb9bcc885d5b5199cca13dfaad..cfacb17177dba1cda77cadd33f2b7944d1945b4a 100644 (file)
@@ -1,3 +1,10 @@
+2008-10-02  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XslVariable.cs : now XPathNodeIterator.Current is always null at
+         position 0, so reduced dependency on it.
+       * XslCopy.cs : now CurrentNode property cannot be moved, so copy it
+         to a local variable.
+
 2008-06-03  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XslVariable.cs : In XslGeneralVariable.Evaluate(), always wrap
index 5566ca51844a47bdbaa3a570668cafd965e07251..614d4e9348a44d264e4b2afe7702038013a05017 100644 (file)
@@ -67,14 +67,15 @@ namespace Mono.Xml.Xsl.Operations {
                        if (p.Debugger != null)
                                p.Debugger.DebugExecute (p, this.DebugInput);
 
-                       switch (p.CurrentNode.NodeType)
+                       XPathNavigator nav = p.CurrentNode;
+                       switch (nav.NodeType)
                        {
                        case XPathNodeType.Root:
                                if (p.Out.CanProcessAttributes && useAttributeSets != null)
                                        foreach (XmlQualifiedName s in useAttributeSets) {
                                                XslAttributeSet attset = p.ResolveAttributeSet (s);
                                                if (attset == null)
-                                                       throw new XsltException ("Attribute set was not found", null, p.CurrentNode);
+                                                       throw new XsltException ("Attribute set was not found", null, nav);
                                                attset.Evaluate (p);
                                        }
 
@@ -82,21 +83,21 @@ namespace Mono.Xml.Xsl.Operations {
                                break;
                        case XPathNodeType.Element:
                                bool isCData = p.InsideCDataElement;
-                               string prefix = p.CurrentNode.Prefix;
-                               p.PushElementState (prefix, p.CurrentNode.LocalName, p.CurrentNode.NamespaceURI, true);
-                               p.Out.WriteStartElement (prefix, p.CurrentNode.LocalName, p.CurrentNode.NamespaceURI);
+                               string prefix = nav.Prefix;
+                               p.PushElementState (prefix, nav.LocalName, nav.NamespaceURI, true);
+                               p.Out.WriteStartElement (prefix, nav.LocalName, nav.NamespaceURI);
                                
                                if (useAttributeSets != null)
                                        foreach (XmlQualifiedName s in useAttributeSets)
                                                p.ResolveAttributeSet (s).Evaluate (p);
 
-                               if (p.CurrentNode.MoveToFirstNamespace (XPathNamespaceScope.ExcludeXml)) {
+                               if (nav.MoveToFirstNamespace (XPathNamespaceScope.ExcludeXml)) {
                                        do {
-                                               if (p.CurrentNode.LocalName == prefix)
+                                               if (nav.LocalName == prefix)
                                                        continue;
-                                               p.Out.WriteNamespaceDecl (p.CurrentNode.LocalName, p.CurrentNode.Value);
-                                       } while (p.CurrentNode.MoveToNextNamespace (XPathNamespaceScope.ExcludeXml));
-                                       p.CurrentNode.MoveToParent ();
+                                               p.Out.WriteNamespaceDecl (nav.LocalName, nav.Value);
+                                       } while (nav.MoveToNextNamespace (XPathNamespaceScope.ExcludeXml));
+                                       nav.MoveToParent ();
                                }
 
                                if (children != null) children.Evaluate (p);
@@ -105,35 +106,35 @@ namespace Mono.Xml.Xsl.Operations {
                                p.PopCDataState (isCData);
                                break;
                        case XPathNodeType.Attribute:
-                               p.Out.WriteAttributeString (p.CurrentNode.Prefix, p.CurrentNode.LocalName, p.CurrentNode.NamespaceURI, p.CurrentNode.Value);
+                               p.Out.WriteAttributeString (nav.Prefix, nav.LocalName, nav.NamespaceURI, nav.Value);
                                break;
                        
                        case XPathNodeType.SignificantWhitespace:
                        case XPathNodeType.Whitespace:
                                bool cdata = p.Out.InsideCDataSection;
                                p.Out.InsideCDataSection = false;
-                               p.Out.WriteString (p.CurrentNode.Value);
+                               p.Out.WriteString (nav.Value);
                                p.Out.InsideCDataSection = cdata;
                                break;
                        case XPathNodeType.Text:
-                               p.Out.WriteString (p.CurrentNode.Value);
+                               p.Out.WriteString (nav.Value);
                                break;
                        
                        case XPathNodeType.Comment:
-                               p.Out.WriteComment (p.CurrentNode.Value);
+                               p.Out.WriteComment (nav.Value);
                                break;
                        
                        case XPathNodeType.ProcessingInstruction:
-                               p.Out.WriteProcessingInstruction (p.CurrentNode.Name, p.CurrentNode.Value);
+                               p.Out.WriteProcessingInstruction (nav.Name, nav.Value);
                                break;
 
                        case XPathNodeType.Namespace:
-                               if (p.XPathContext.ElementPrefix != p.CurrentNode.Name)
-                                       p.Out.WriteNamespaceDecl (p.CurrentNode.Name, p.CurrentNode.Value);
+                               if (p.XPathContext.ElementPrefix != nav.Name)
+                                       p.Out.WriteNamespaceDecl (nav.Name, nav.Value);
                                break;
 
                        default:
-//                             Console.WriteLine ("unhandled node type {0}", p.CurrentNode.NodeType);
+//                             Console.WriteLine ("unhandled node type {0}", nav.NodeType);
                                break;
                        }
                }
index 3a75bd29ccc4bbcd2c6dc0ed6ce5aa5f7f9918e5..430244ff882e7c595ae88949de6fb19099be5f2b 100644 (file)
@@ -89,16 +89,13 @@ namespace Mono.Xml.Xsl.Operations {
                                }
                                return o;
                        } else if (content != null) {
-//                             XmlNodeWriter w = new XmlNodeWriter (false);
-//                             DTMXPathDocumentWriter w = new DTMXPathDocumentWriter (p.CurrentNode.NameTable, 200);
-                               DTMXPathDocumentWriter2 w = new DTMXPathDocumentWriter2 (p.CurrentNode.NameTable, 200);
+                               DTMXPathDocumentWriter2 w = new DTMXPathDocumentWriter2 (p.Root.NameTable, 200);
                                Outputter outputter = new GenericOutputter(w, p.Outputs, null, true);
                                p.PushOutput (outputter);
+                               if (p.CurrentNodeset.CurrentPosition == 0)
+                                       p.NodesetMoveNext ();
                                content.Evaluate (p);
                                p.PopOutput ();
-//                             return w.Document.CreateNavigator ().SelectChildren (XPathNodeType.All);
-//                             return w.CreateDocument ().CreateNavigator ().SelectChildren (XPathNodeType.All);
-//                             return w.Document.CreateNavigator ();
                                return w.CreateDocument ().CreateNavigator ();
                        } else {
                                return "";
index 3c9c535b38d7277e9bf12c51c198bbfaaedbe4ee..bec6e14e627aa6c97b99bfdbc387fd6fd88c7efc 100644 (file)
@@ -1,3 +1,16 @@
+2008-10-03  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XslTransformProcessor.cs : reduce BaseIterator dependency.
+
+2008-10-02  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * GenericOutputter.cs : fix dummy namespace generation. (It might be
+         extraneous change and might be reverted later.)
+       * XslTransformProcessor.cs : some EvaluateXxx ()changes that may
+         be enabled later. Reduce BaseIterator dependency.
+       * XslFunctions.cs : reduce bad uses of "as" operator.
+       * XslKey.cs : Evaluate() result may be null now.
+
 2008-06-03  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XsltDebuggerWrapper.cs : allow public methods in debugger instance.
index 79c7259956f17a0956b18608ad17393f9cc33825..d7571a9c59f05d16395c8dfba4064fe445a8870c 100644 (file)
@@ -194,16 +194,18 @@ namespace Mono.Xml.Xsl
                                                prefix = existing;
                                        if (attr.Namespace.Length > 0) {
                                                if (prefix == null || prefix == String.Empty)
+                                               { // ADD
                                                        // empty prefix is not allowed
                                                        // for non-local attributes.
                                                        prefix = "xp_" + _xpCount++;
-                                               if (existing != prefix) {
+                                               //if (existing != prefix) {
                                                        while (_nsManager.LookupNamespace (prefix) != null)
                                                                prefix = "xp_" + _xpCount++;
                                                        newNamespaces.Add (prefix);
                                                        _currentNamespaceDecls.Add (prefix, attr.Namespace);
                                                        _nsManager.AddNamespace (prefix, attr.Namespace);
-                                               }
+                                               //}
+                                               } // ADD
                                        }
                                        Emitter.WriteAttributeString (prefix, attr.LocalName, attr.Namespace, attr.Value);
                                }
index 6b280b94592ad11b16fce809c9c0685243d66e78..7cc29aad08e88ce030607649280808ad3111b09a 100644 (file)
@@ -191,7 +191,8 @@ namespace Mono.Xml.Xsl
 
                public override object Evaluate (BaseIterator iter)
                {
-                       return new SelfIterator ((iter.NamespaceManager as XsltCompiledContext).Processor.CurrentNode, null);
+                       XsltCompiledContext ctx = (XsltCompiledContext) iter.NamespaceManager;
+                       return new SelfIterator ((ctx).Processor.CurrentNode, ctx);
                }
 
                internal override bool Peer {
@@ -397,7 +398,7 @@ namespace Mono.Xml.Xsl
                                nm = XslNameUtil.FromString (arg2.EvaluateString (iter), ctx);
                        
                        try {
-                               return (iter.NamespaceManager as XsltCompiledContext).Processor.CompiledStyle
+                               return ((XsltCompiledContext) iter.NamespaceManager).Processor.CompiledStyle
                                .LookupDecimalFormat (nm).FormatNumber (d, s);
                        } catch (ArgumentException ex) {
                                throw new XsltException (ex.Message, ex, iter.Current);
index 7b8b64a80013e45d86c1d82107def5aa316c95d2..d3f1103ff8393b4095d2b3d0bd79a45069dd2475 100644 (file)
@@ -266,7 +266,7 @@ namespace Mono.Xml.Xsl
                                                        iter, result, tmp);
                                }
                        }
-                       else {
+                       else if (nav != null) {
                                ArrayList nodes = GetNodesByValue (
                                        nav, XPathFunctions.ToString (o), ctx);
                                if (nodes != null)
index 81b885991c3c0428b95b015a4c3fea64e9c58c6c..a4a8f6c602e1c082dd57c7136107ce0d39411335 100644 (file)
@@ -80,8 +80,8 @@ namespace Mono.Xml.Xsl {
 //                     this.outputStylesheetXmlns = true;
                        this.currentOutputUri = String.Empty;
 
-                       XPathExpression exp = root.Compile (".");
-                       PushNodeset (root.Select (exp, this.XPathContext));
+                       PushNodeset (new SelfIterator (root, this.XPathContext));
+CurrentNodeset.MoveNext ();
                        
                        // have to evaluate the params first, as Global vars may
                        // be dependant on them
@@ -109,7 +109,7 @@ namespace Mono.Xml.Xsl {
                        PopNodeset ();
                        
                        this.PushOutput (outputtter);
-                       this.ApplyTemplates (root.Select (exp, this.XPathContext), QName.Empty, null);
+                       this.ApplyTemplates (new SelfIterator (root, this.XPathContext), QName.Empty, null);
                        this.PopOutput ();
                }
 
@@ -119,7 +119,9 @@ namespace Mono.Xml.Xsl {
 
                public CompiledStylesheet CompiledStyle { get { return compiledStyle; }}
                public XsltArgumentList Arguments {get{return args;}}
-               
+
+               public XPathNavigator Root { get { return root; } }
+
                public MSXslScriptManager ScriptManager {
                        get { return compiledStyle.ScriptManager; }
                }
@@ -473,7 +475,10 @@ namespace Mono.Xml.Xsl {
 
                public void PushNodeset (XPathNodeIterator itr)
                {
-                       nodesetStack.Add (itr);
+                       BaseIterator bi = itr as BaseIterator;
+                       bi = bi != null ? bi : new WrapperIterator (itr, null);
+                       bi.NamespaceManager = XPathContext;
+                       nodesetStack.Add (bi);
                }
                
                public void PopNodeset ()
@@ -492,30 +497,66 @@ namespace Mono.Xml.Xsl {
                public object Evaluate (XPathExpression expr)
                {
                        XPathNodeIterator itr = CurrentNodeset;
-                       return itr.Current.Evaluate (expr, itr, XPathContext);
+                       BaseIterator bi = (BaseIterator) itr;
+                       CompiledExpression cexpr = (CompiledExpression) expr;
+                       if (bi.NamespaceManager == null)
+                               bi.NamespaceManager = cexpr.NamespaceManager;
+                       return cexpr.Evaluate (bi);
                }
                
                public string EvaluateString (XPathExpression expr)
                {
                        XPathNodeIterator itr = CurrentNodeset;
+#if true
                        return itr.Current.EvaluateString (expr, itr, XPathContext);
+#else
+                       BaseIterator bi = (BaseIterator) itr;
+                       CompiledExpression cexpr = (CompiledExpression) expr;
+                       if (bi.NamespaceManager == null)
+                               bi.NamespaceManager = cexpr.NamespaceManager;
+                       return cexpr.EvaluateString (bi);
+#endif
                }
                                
                public bool EvaluateBoolean (XPathExpression expr)
                {
                        XPathNodeIterator itr = CurrentNodeset;
+#if true
                        return itr.Current.EvaluateBoolean (expr, itr, XPathContext);
+#else
+                       BaseIterator bi = (BaseIterator) itr;
+                       CompiledExpression cexpr = (CompiledExpression) expr;
+                       if (bi.NamespaceManager == null)
+                               bi.NamespaceManager = cexpr.NamespaceManager;
+                       return cexpr.EvaluateBoolean (bi);
+#endif
                }
                
                public double EvaluateNumber (XPathExpression expr)
                {
                        XPathNodeIterator itr = CurrentNodeset;
+#if true
                        return itr.Current.EvaluateNumber (expr, itr, XPathContext);
+#else
+                       BaseIterator bi = (BaseIterator) itr;
+                       CompiledExpression cexpr = (CompiledExpression) expr;
+                       if (bi.NamespaceManager == null)
+                               bi.NamespaceManager = cexpr.NamespaceManager;
+                       return cexpr.EvaluateNumber (bi);
+#endif
                }
                
                public XPathNodeIterator Select (XPathExpression expr)
                {
+#if true
                        return CurrentNodeset.Current.Select (expr, XPathContext);
+#else
+                       BaseIterator bi = (BaseIterator) CurrentNodeset;
+                       CompiledExpression cexpr = (CompiledExpression) expr;
+                       if (bi.NamespaceManager == null)
+                               bi.NamespaceManager = cexpr.NamespaceManager;
+                       return cexpr.EvaluateNodeSet (bi);
+#endif
                }
                
                #endregion
index 65e1b1cca97c91773f5cc446f883b8c3eecf2e6c..5c51f3e08a90226f05c2c2e6c6a603f21a8267e3 100644 (file)
@@ -1,3 +1,52 @@
+2008-10-08  Atsushi Enomoto <atsushi@ximian.com>
+
+       * Expression.cs : fix WeakReference usage for such case that it
+         might GC-ed between .IsAlive check and .Target retrieval.
+
+2008-10-06  Atsushi Enomoto <atsushi@ximian.com>
+
+       * XPathExpression.cs, Expression.cs : Cache compiled xpath
+         expressions so that they don't have to be parsed repeatedly.
+
+2008-10-06  Atsushi Enomoto <atsushi@ximian.com>
+
+       * Expression.cs : unindend cases that do not match our coding style.
+
+2008-10-06  Atsushi Enomoto <atsushi@ximian.com>
+
+       * Expression.cs : fixed peer & subtree requirement and reduced extra
+         dependency on RequireSorting property.
+
+2008-10-06  Atsushi Enomoto <atsushi@ximian.com>
+
+       * Expression.cs, Iterator.cs : simplify SlashIterator by introducing
+         SortedIterator.
+
+2008-10-06  Atsushi Enomoto <atsushi@ximian.com>
+
+       * Expression.cs, Iterator.cs : ChildIterator is not a SimpleIterator
+         now. And reduced extra clone when the context node has no child.
+
+2008-10-03  Atsushi Enomoto <atsushi@ximian.com>
+
+       * Iterator.cs : now we do not seem to need clone in
+         SimpleIterator.Current.
+
+2008-10-03  Atsushi Enomoto <atsushi@ximian.com>
+
+       * XPathNavigator.cs : enable EnumerableIterator with some fixes.
+       * Iterator.cs : reduce extra steps for empty simple iterator.
+
+2008-10-02  Atsushi Enomoto <atsushi@ximian.com>
+
+       * Iterator.cs, DefaultContext.cs, XPathNavigator.cs, Expression.cs:
+         couple of refactoring: reduced presumption on BaseIterator (it is
+         premised in not a few places, but it might change; see
+         EnumerableIterator in XPathNavigator.cs).
+         Now BaseIterator.Current is always null (to clean up ambiguous
+         implementation state). Current property is now always moved to
+         the current node in the iterator when returned.
+
 2008-09-19  Atsushi Enomoto <atsushi@ximian.com>
 
        * DefaultContext.cs, Expression.cs: do not premise BaseIterator.
index a13348891ff5cf6a8898a14714be7458b557dc33..97b322859ee47c7a81b88e5e677a2d4a57ec6a68 100644 (file)
@@ -282,7 +282,7 @@ namespace System.Xml.XPath
                        String strArgs;
                        object val = arg0.Evaluate (iter);
                        
-                       BaseIterator valItr = val as BaseIterator;
+                       XPathNodeIterator valItr = val as XPathNodeIterator;
                        if (valItr != null)
                        {
                                strArgs = "";
index a2677d560a2057f3791783c73be176730f75b632..22ca3bf6f2144a3fde0eb9fbc1d06bc8ce66a930 100644 (file)
@@ -44,6 +44,51 @@ using NSResolver = System.Xml.XmlNamespaceManager;
 
 namespace System.Xml.XPath
 {
+       internal static class ExpressionCache
+       {
+               static readonly Hashtable table_per_ctx = new Hashtable ();
+               static object dummy = new object ();
+
+               public static XPathExpression Get (string xpath, IStaticXsltContext ctx)
+               {
+                       object ctxkey = ctx != null ? ctx : dummy;
+
+                       WeakReference wr = table_per_ctx [ctxkey] as WeakReference;
+                       if (wr == null)
+                               return null;
+                       if (!wr.IsAlive) {
+                               table_per_ctx [ctxkey] = null;
+                               return null;
+                       }
+                       Hashtable table = (Hashtable) wr.Target;
+
+                       wr = table [xpath] as WeakReference;
+                       if (wr != null) {
+                               if (wr.IsAlive)
+                                       // it may return null (as it might be GC-ed), but we don't have to worrt about it here.
+                                       return (XPathExpression) wr.Target;
+                               table [xpath] = null;
+                       }
+                       return null;
+               }
+
+               public static void Set (string xpath, IStaticXsltContext ctx, XPathExpression exp)
+               {
+                       object ctxkey = ctx != null ? ctx : dummy;
+
+                       Hashtable table = null;
+
+                       WeakReference wr = table_per_ctx [ctxkey] as WeakReference;
+                       if (wr != null && wr.IsAlive)
+                               table = (Hashtable) wr.Target;
+                       if (table == null) {
+                               table = new Hashtable ();
+                               table_per_ctx [ctxkey] = new WeakReference (table);
+                       }
+                       table [xpath] = new WeakReference (exp);
+               }
+       }
+
 #if XPATH_DEBUG
        internal class CompiledExpression : Test.Xml.XPath.XPathExpression
 #else
@@ -95,6 +140,9 @@ namespace System.Xml.XPath
                        if (_sorters != null)
                                return EvaluateNodeSet (iter);
 
+#if false
+                       return _expr.Evaluate (iter);
+#else
                        try {
                                return _expr.Evaluate (iter);
                        }
@@ -107,6 +155,7 @@ namespace System.Xml.XPath
                        catch (Exception e) {
                                throw new XPathException ("Error during evaluation", e);
                        }
+#endif
                }
                public XPathNodeIterator EvaluateNodeSet (BaseIterator iter)
                {
@@ -452,9 +501,14 @@ namespace System.Xml.XPath
                        case XPathResultType.Any:
                        case XPathResultType.Navigator: // FIXME: It may pass not-allowed use of RTF
                                object o = Evaluate (iter);
-                               BaseIterator iterResult = o as BaseIterator;
-                               if (iterResult != null)
+                               XPathNodeIterator xi = o as XPathNodeIterator;
+                               BaseIterator iterResult = null;
+                               if (xi != null) {
+                                       iterResult = xi as BaseIterator;
+                                       if (iterResult == null)
+                                               iterResult = new WrapperIterator (xi, iter.NamespaceManager);
                                        return iterResult;
+                               }
                                XPathNavigator nav = o as XPathNavigator;
                                if (nav != null) {
                                        XPathNodeIterator xiter = nav.SelectChildren (XPathNodeType.All);
@@ -513,20 +567,19 @@ namespace System.Xml.XPath
                        if (type == XPathResultType.Any)
                                type = GetReturnType (result);
 
-                       switch (type)
-                       {
-                               case XPathResultType.Number:
-                                       return (double)result;
-                               case XPathResultType.Boolean:
-                                       return ((bool) result) ? 1.0 : 0.0;
-                               case XPathResultType.NodeSet:
-                                       return XPathFunctions.ToNumber (EvaluateString (iter));
-                               case XPathResultType.String:
-                                       return XPathFunctions.ToNumber ((string) result);
-                               case XPathResultType.Navigator:
-                                       return XPathFunctions.ToNumber (((XPathNavigator) (result)).Value);
-                               default:
-                                       throw new XPathException ("invalid node type");
+                       switch (type) {
+                       case XPathResultType.Number:
+                               return (double)result;
+                       case XPathResultType.Boolean:
+                               return ((bool) result) ? 1.0 : 0.0;
+                       case XPathResultType.NodeSet:
+                               return XPathFunctions.ToNumber (EvaluateString (iter));
+                       case XPathResultType.String:
+                               return XPathFunctions.ToNumber ((string) result);
+                       case XPathResultType.Navigator:
+                               return XPathFunctions.ToNumber (((XPathNavigator) (result)).Value);
+                       default:
+                               throw new XPathException ("invalid node type");
                        }
                }
 
@@ -536,26 +589,25 @@ namespace System.Xml.XPath
                        XPathResultType type = GetReturnType (iter);
                        if (type == XPathResultType.Any)
                                type = GetReturnType (result);
-                       switch (type)
+                       switch (type) {
+                       case XPathResultType.Number:
+                               double d = (double) result;
+                               return XPathFunctions.ToString (d);
+                       case XPathResultType.Boolean:
+                               return ((bool) result) ? "true" : "false";
+                       case XPathResultType.String:
+                               return (string) result;
+                       case XPathResultType.NodeSet:
                        {
-                               case XPathResultType.Number:
-                                       double d = (double) result;
-                                       return XPathFunctions.ToString (d);
-                               case XPathResultType.Boolean:
-                                       return ((bool) result) ? "true" : "false";
-                               case XPathResultType.String:
-                                       return (string) result;
-                               case XPathResultType.NodeSet:
-                               {
-                                       BaseIterator iterResult = (BaseIterator) result;
-                                       if (iterResult == null || !iterResult.MoveNext ())
-                                               return "";
-                                       return iterResult.Current.Value;
-                               }
-                               case XPathResultType.Navigator:
-                                       return ((XPathNavigator) result).Value;
-                               default:
-                                       throw new XPathException ("invalid node type");
+                               BaseIterator iterResult = (BaseIterator) result;
+                               if (iterResult == null || !iterResult.MoveNext ())
+                                       return "";
+                               return iterResult.Current.Value;
+                       }
+                       case XPathResultType.Navigator:
+                               return ((XPathNavigator) result).Value;
+                       default:
+                               throw new XPathException ("invalid node type");
                        }
                }
 
@@ -565,33 +617,27 @@ namespace System.Xml.XPath
                        XPathResultType type = GetReturnType (iter);
                        if (type == XPathResultType.Any)
                                type = GetReturnType (result);
-                       switch (type)
-                       {
-                               case XPathResultType.Number:
-                               {
-                                       double num = Convert.ToDouble (result);
-                                       return (num != 0.0 && num != -0.0 && !Double.IsNaN (num));
-                               }
-                               case XPathResultType.Boolean:
-                                       return (bool) result;
-                               case XPathResultType.String:
-                                       return ((string) result).Length != 0;
-                               case XPathResultType.NodeSet:
-                               {
-                                       BaseIterator iterResult = (BaseIterator) result;
-                                       return (iterResult != null && iterResult.MoveNext ());
-                               }
-                               case XPathResultType.Navigator:
-                                       return (((XPathNavigator) result).HasChildren);
-                               default:
-                                       throw new XPathException ("invalid node type");
+                       switch (type) {
+                       case XPathResultType.Number:
+                               double num = Convert.ToDouble (result);
+                               return (num != 0.0 && num != -0.0 && !Double.IsNaN (num));
+                       case XPathResultType.Boolean:
+                               return (bool) result;
+                       case XPathResultType.String:
+                               return ((string) result).Length != 0;
+                       case XPathResultType.NodeSet:
+                               BaseIterator iterResult = (BaseIterator) result;
+                               return (iterResult != null && iterResult.MoveNext ());
+                       case XPathResultType.Navigator:
+                               return (((XPathNavigator) result).HasChildren);
+                       default:
+                               throw new XPathException ("invalid node type");
                        }
                }
 
                public object EvaluateAs (BaseIterator iter, XPathResultType type)
                {
-                       switch (type)
-                       {
+                       switch (type) {
                        case XPathResultType.Boolean:
                                return EvaluateBoolean (iter);
                        case XPathResultType.NodeSet:
@@ -1182,9 +1228,10 @@ namespace System.Xml.XPath
                        // Peer and subtree optimization. see
                        // http://idealliance.org/papers/dx_xmle04/papers/02-03-02/02-03-02.html
                        BaseIterator iterLeft = left.EvaluateNodeSet (iter);
-                       if (left.Peer && right.Subtree && !RequireSorting)
+                       if (left.Peer && right.Subtree)
                                return new SimpleSlashIterator (iterLeft, right);
-                       return new SlashIterator (iterLeft, right, RequireSorting);
+                       BaseIterator si = new SlashIterator (iterLeft, right);
+                       return RequireSorting ? new SortedIterator (si) : si;
                }
 
                public override bool RequireSorting { get { return left.RequireSorting || right.RequireSorting; } }
@@ -1250,16 +1297,13 @@ namespace System.Xml.XPath
                        if (left.Peer && !left.RequireSorting)
                                il = new SimpleSlashIterator (
                                        il, DescendantOrSelfStar);
-                       else
-                               il = new SlashIterator (il,
-                                       DescendantOrSelfStar,
-                                       left.RequireSorting);
+                       else {
+                               BaseIterator bb = new SlashIterator (il, DescendantOrSelfStar);
+                               il = left.RequireSorting ? new SortedIterator (bb) : bb;
+                       }
 
-                       return new SlashIterator (
-                               il,
-                               right,
-                               DescendantOrSelfStar.RequireSorting || right.RequireSorting
-                       );
+                       SlashIterator b = new SlashIterator (il, right);
+                       return RequireSorting ? (BaseIterator) new SortedIterator (b) : b;
                }
 
                public override bool RequireSorting { get { return left.RequireSorting || right.RequireSorting; } }
@@ -1289,6 +1333,10 @@ namespace System.Xml.XPath
                public override String ToString () { return ""; }
                public override object Evaluate (BaseIterator iter)
                {
+                       if (iter.CurrentPosition == 0) {
+                               iter = (BaseIterator) iter.Clone ();
+                               iter.MoveNext ();
+                       }
                        XPathNavigator navRoot = iter.Current.Clone ();
                        navRoot.MoveToRoot ();
                        return new SelfIterator (navRoot, iter.NamespaceManager);
@@ -1335,8 +1383,7 @@ namespace System.Xml.XPath
                {
                        get
                        {
-                               switch (_axis)
-                               {
+                               switch (_axis) {
                                case Axes.Namespace:
                                        return XPathNodeType.Namespace;
                                case Axes.Attribute:
@@ -1348,71 +1395,69 @@ namespace System.Xml.XPath
                }
                public override string ToString ()
                {
-                       switch (_axis)
-                       {
-                               case Axes.Ancestor:
-                                       return "ancestor";
-                               case Axes.AncestorOrSelf:
-                                       return "ancestor-or-self";
-                               case Axes.Attribute:
-                                       return "attribute";
-                               case Axes.Child:
-                                       return "child";
-                               case Axes.Descendant:
-                                       return "descendant";
-                               case Axes.DescendantOrSelf:
-                                       return "descendant-or-self";
-                               case Axes.Following:
-                                       return "following";
-                               case Axes.FollowingSibling:
-                                       return "following-sibling";
-                               case Axes.Namespace:
-                                       return "namespace";
-                               case Axes.Parent:
-                                       return "parent";
-                               case Axes.Preceding:
-                                       return "preceding";
-                               case Axes.PrecedingSibling:
-                                       return "preceding-sibling";
-                               case Axes.Self:
-                                       return "self";
-                               default:
-                                       throw new IndexOutOfRangeException ();
+                       switch (_axis) {
+                       case Axes.Ancestor:
+                               return "ancestor";
+                       case Axes.AncestorOrSelf:
+                               return "ancestor-or-self";
+                       case Axes.Attribute:
+                               return "attribute";
+                       case Axes.Child:
+                               return "child";
+                       case Axes.Descendant:
+                               return "descendant";
+                       case Axes.DescendantOrSelf:
+                               return "descendant-or-self";
+                       case Axes.Following:
+                               return "following";
+                       case Axes.FollowingSibling:
+                               return "following-sibling";
+                       case Axes.Namespace:
+                               return "namespace";
+                       case Axes.Parent:
+                               return "parent";
+                       case Axes.Preceding:
+                               return "preceding";
+                       case Axes.PrecedingSibling:
+                               return "preceding-sibling";
+                       case Axes.Self:
+                               return "self";
+                       default:
+                               throw new IndexOutOfRangeException ();
                        }
                }
                public Axes Axis { get { return _axis; }}
-               public virtual SimpleIterator Evaluate (BaseIterator iter)
-               {
-                       switch (_axis)
-                       {
-                               case Axes.Ancestor:
-                                       return new AncestorIterator (iter);
-                               case Axes.AncestorOrSelf:
-                                       return new AncestorOrSelfIterator (iter);
-                               case Axes.Attribute:
-                                       return new AttributeIterator (iter);
-                               case Axes.Child:
-                                       return new ChildIterator (iter);
-                               case Axes.Descendant:
-                                       return new DescendantIterator (iter);
-                               case Axes.DescendantOrSelf:
-                                       return new DescendantOrSelfIterator (iter);
-                               case Axes.Following:
-                                       return new FollowingIterator (iter);
-                               case Axes.FollowingSibling:
-                                       return new FollowingSiblingIterator (iter);
-                               case Axes.Namespace:
-                                       return new NamespaceIterator (iter);
-                               case Axes.Parent:
-                                       return new ParentIterator (iter);
-                               case Axes.Preceding:
-                                       return new PrecedingIterator (iter);
-                               case Axes.PrecedingSibling:
-                                       return new PrecedingSiblingIterator (iter);
-                               case Axes.Self:
-                                       return new SelfIterator (iter);
-                               default:
-                                       throw new IndexOutOfRangeException ();
+               public BaseIterator Evaluate (BaseIterator iter)
+               {
+                       switch (_axis) {
+                       case Axes.Ancestor:
+                               return new AncestorIterator (iter);
+                       case Axes.AncestorOrSelf:
+                               return new AncestorOrSelfIterator (iter);
+                       case Axes.Attribute:
+                               return new AttributeIterator (iter);
+                       case Axes.Child:
+                               return new ChildIterator (iter);
+                       case Axes.Descendant:
+                               return new DescendantIterator (iter);
+                       case Axes.DescendantOrSelf:
+                               return new DescendantOrSelfIterator (iter);
+                       case Axes.Following:
+                               return new FollowingIterator (iter);
+                       case Axes.FollowingSibling:
+                               return new FollowingSiblingIterator (iter);
+                       case Axes.Namespace:
+                               return new NamespaceIterator (iter);
+                       case Axes.Parent:
+                               return new ParentIterator (iter);
+                       case Axes.Preceding:
+                               return new PrecedingIterator (iter);
+                       case Axes.PrecedingSibling:
+                               return new PrecedingSiblingIterator (iter);
+                       case Axes.Self:
+                               return new SelfIterator (iter);
+                       default:
+                               throw new IndexOutOfRangeException ();
                        }
                }
        }
@@ -1428,7 +1473,7 @@ namespace System.Xml.XPath
                public AxisSpecifier Axis { get { return _axis; }}
                public override object Evaluate (BaseIterator iter)
                {
-                       SimpleIterator iterAxis = _axis.Evaluate (iter);
+                       BaseIterator iterAxis = _axis.Evaluate (iter);
                        return new AxisIterator (iterAxis, this);
                }
                
@@ -1474,7 +1519,9 @@ namespace System.Xml.XPath
                                case Axes.Ancestor:
                                case Axes.AncestorOrSelf:
                                case Axes.Preceding:
+                               case Axes.PrecedingSibling:
                                case Axes.Following:
+                               case Axes.FollowingSibling:
                                        return false;
                                default:
                                        return true;
@@ -1530,50 +1577,48 @@ namespace System.Xml.XPath
 
                private static String ToString (XPathNodeType type)
                {
-                       switch (type)
-                       {
-                               case XPathNodeType.Comment:
-                                       return "comment";
-                               case XPathNodeType.Text:
-                                       return "text";
-                               case XPathNodeType.ProcessingInstruction:
-                                       return "processing-instruction";
-                               case XPathNodeType.All:
-                               case XPathNodeType.Attribute:
-                               case XPathNodeType.Element:
-                               case XPathNodeType.Namespace:
-                                       return "node";
-                               default:
-                                       return "node-type [" + type.ToString () + "]";
+                       switch (type) {
+                       case XPathNodeType.Comment:
+                               return "comment";
+                       case XPathNodeType.Text:
+                               return "text";
+                       case XPathNodeType.ProcessingInstruction:
+                               return "processing-instruction";
+                       case XPathNodeType.All:
+                       case XPathNodeType.Attribute:
+                       case XPathNodeType.Element:
+                       case XPathNodeType.Namespace:
+                               return "node";
+                       default:
+                               return "node-type [" + type.ToString () + "]";
                        }
                }
 
                public override bool Match (NSResolver nsm, XPathNavigator nav)
                {
                        XPathNodeType nodeType = nav.NodeType;
-                       switch (type)
-                       {
-                               case XPathNodeType.All:
-                                       return true;
+                       switch (type) {
+                       case XPathNodeType.All:
+                               return true;
 
-                               case XPathNodeType.ProcessingInstruction:
-                                       if (nodeType != XPathNodeType.ProcessingInstruction)
-                                               return false;
-                                       if (_param != null && nav.Name != _param)
-                                               return false;
-                                       return true;
-                               
+                       case XPathNodeType.ProcessingInstruction:
+                               if (nodeType != XPathNodeType.ProcessingInstruction)
+                                       return false;
+                               if (_param != null && nav.Name != _param)
+                                       return false;
+                               return true;
+                       
+                       case XPathNodeType.Text:
+                               switch (nodeType) {
                                case XPathNodeType.Text:
-                                       switch (nodeType) {
-                                       case XPathNodeType.Text:
-                                       case XPathNodeType.Whitespace:
-                                       case XPathNodeType.SignificantWhitespace:
-                                               return true;
-                                       default:
-                                               return false;
-                                       }
+                               case XPathNodeType.Whitespace:
+                               case XPathNodeType.SignificantWhitespace:
+                                       return true;
                                default:
-                                       return type == nodeType;
+                                       return false;
+                               }
+                       default:
+                               return type == nodeType;
                        }
                }
                
@@ -1922,7 +1967,10 @@ namespace System.Xml.XPath
                public override object Evaluate (BaseIterator iter)
                {
                        object o = (_expr.Evaluate (iter));
-                       BaseIterator predBase = o as BaseIterator;
+                       XPathNodeIterator xi = o as XPathNodeIterator;
+                       BaseIterator predBase = xi as BaseIterator;
+                       if (predBase == null && xi != null)
+                               predBase = new WrapperIterator (xi, iter.NamespaceManager);
                        if (predBase != null)
                                return new ParensIterator (predBase);
                        else
@@ -1995,33 +2043,33 @@ namespace System.Xml.XPath
                                return new ExprFunctionCall (name, args, ctx);
                        
                        switch (name.Name) {
-                               case "last": return new XPathFunctionLast (args);
-                               case "position": return new XPathFunctionPosition (args);
-                               case "count": return new XPathFunctionCount (args);
-                               case "id": return new XPathFunctionId (args);
-                               case "local-name": return new XPathFunctionLocalName (args);
-                               case "namespace-uri": return new XPathFunctionNamespaceUri (args);
-                               case "name": return new XPathFunctionName (args);
-                               case "string": return new XPathFunctionString (args);
-                               case "concat": return new XPathFunctionConcat (args);
-                               case "starts-with": return new XPathFunctionStartsWith (args);
-                               case "contains": return new XPathFunctionContains (args);
-                               case "substring-before": return new XPathFunctionSubstringBefore (args);
-                               case "substring-after": return new XPathFunctionSubstringAfter (args);
-                               case "substring": return new XPathFunctionSubstring (args);
-                               case "string-length": return new XPathFunctionStringLength (args);
-                               case "normalize-space": return new XPathFunctionNormalizeSpace (args);
-                               case "translate": return new XPathFunctionTranslate (args);
-                               case "boolean": return new XPathFunctionBoolean (args);
-                               case "not": return new XPathFunctionNot (args);
-                               case "true": return new XPathFunctionTrue (args);
-                               case "false": return new XPathFunctionFalse (args);
-                               case "lang": return new XPathFunctionLang (args);
-                               case "number": return new XPathFunctionNumber (args);
-                               case "sum": return new XPathFunctionSum (args);
-                               case "floor": return new XPathFunctionFloor (args);
-                               case "ceiling": return new XPathFunctionCeil (args);
-                               case "round": return new XPathFunctionRound (args);
+                       case "last": return new XPathFunctionLast (args);
+                       case "position": return new XPathFunctionPosition (args);
+                       case "count": return new XPathFunctionCount (args);
+                       case "id": return new XPathFunctionId (args);
+                       case "local-name": return new XPathFunctionLocalName (args);
+                       case "namespace-uri": return new XPathFunctionNamespaceUri (args);
+                       case "name": return new XPathFunctionName (args);
+                       case "string": return new XPathFunctionString (args);
+                       case "concat": return new XPathFunctionConcat (args);
+                       case "starts-with": return new XPathFunctionStartsWith (args);
+                       case "contains": return new XPathFunctionContains (args);
+                       case "substring-before": return new XPathFunctionSubstringBefore (args);
+                       case "substring-after": return new XPathFunctionSubstringAfter (args);
+                       case "substring": return new XPathFunctionSubstring (args);
+                       case "string-length": return new XPathFunctionStringLength (args);
+                       case "normalize-space": return new XPathFunctionNormalizeSpace (args);
+                       case "translate": return new XPathFunctionTranslate (args);
+                       case "boolean": return new XPathFunctionBoolean (args);
+                       case "not": return new XPathFunctionNot (args);
+                       case "true": return new XPathFunctionTrue (args);
+                       case "false": return new XPathFunctionFalse (args);
+                       case "lang": return new XPathFunctionLang (args);
+                       case "number": return new XPathFunctionNumber (args);
+                       case "sum": return new XPathFunctionSum (args);
+                       case "floor": return new XPathFunctionFloor (args);
+                       case "ceiling": return new XPathFunctionCeil (args);
+                       case "round": return new XPathFunctionRound (args);
                        }
                        return new ExprFunctionCall (name, args, ctx);
                }
index 472524d4805b4453ca6548a4d77184274288e8b9..7fd1d86d223c0f9e5c627e4ac656a37724525b5e 100644 (file)
@@ -84,8 +84,15 @@ namespace System.Xml.XPath
                        get { return position; }
                }
 
+               internal void SetPosition (int pos)
+               {
+                       position = pos;
+               }
+
                public override bool MoveNext ()
                {
+// FIXME: enable this line once I found the culprit of a breakage in WrapperIterator. And remove it again in the final stage.
+//if (CurrentPosition == 0 && Current != null) throw new Exception (GetType ().FullName);
                        if (!MoveNextCore ())
                                return false;
                        position++;
@@ -94,6 +101,12 @@ namespace System.Xml.XPath
 
                public abstract bool MoveNextCore ();
 
+               internal XPathNavigator PeekNext ()
+               {
+                       XPathNodeIterator i = Clone ();
+                       return i.MoveNext () ? i.Current : null;
+               }
+
                public override string ToString ()
                {
                        if (Current != null)
@@ -138,24 +151,46 @@ namespace System.Xml.XPath
        {
                protected readonly XPathNavigator _nav;
                protected XPathNavigator _current;
+               bool skipfirst;
 
                public SimpleIterator (BaseIterator iter) : base (iter.NamespaceManager)
                {
-                       _nav = iter.Current.Clone ();
+                       if (iter.CurrentPosition == 0) {
+                               skipfirst = true;
+                               iter.MoveNext ();
+                       }
+                       if (iter.CurrentPosition > 0)
+                               _nav = iter.Current.Clone ();
                }
                protected SimpleIterator (SimpleIterator other, bool clone) : base (other)
                {
-                       _nav = other._nav.Clone ();
+                       if (other._nav != null)
+                               _nav = clone ? other._nav.Clone () : other._nav;
+                       skipfirst = other.skipfirst;
                }
                public SimpleIterator (XPathNavigator nav, NSResolver nsm) : base (nsm)
                {
                        _nav = nav.Clone ();
                }
 
+               public override bool MoveNext ()
+               {
+                       if (skipfirst) {
+                               if (_nav == null)
+                                       return false; // empty
+                               skipfirst = false;
+                               base.SetPosition (1);
+                               return true;
+                       } else {
+                               return base.MoveNext ();
+                       }
+               }
+
                public override XPathNavigator Current {
                        get {
-                               if (_current == null) // position == 0
-                                       _current = _nav.Clone ();
+                               if (CurrentPosition == 0)
+                                       return null;
+                               _current = _nav;
                                return _current;
                        }
                }
@@ -180,7 +215,7 @@ namespace System.Xml.XPath
                }
 
                public override XPathNavigator Current {
-                       get { return _nav; }
+                       get { return CurrentPosition == 0 ? null : _nav; }
                }
        }
 
@@ -195,6 +230,14 @@ namespace System.Xml.XPath
                {
                        return false;
                }
+
+               public override int CurrentPosition {
+                       get { return 1; }
+               }
+
+               public override XPathNavigator Current {
+                       get { return _nav; }
+               }
        }
 
        internal class ParensIterator : BaseIterator
@@ -226,11 +269,11 @@ namespace System.Xml.XPath
                public ParentIterator (BaseIterator iter) : base (iter)
                {
                        canMove = _nav.MoveToParent ();
-                       _current = _nav;
+                       //_current = _nav;
                }
                private ParentIterator (ParentIterator other, bool dummy) : base (other, true)
                {
-                       _current = _nav;
+                       //_current = _nav;
                        canMove = other.canMove;
                }
                public ParentIterator (XPathNavigator nav, NSResolver nsm) : base (nav, nsm) {}
@@ -244,18 +287,39 @@ namespace System.Xml.XPath
                }
        }
 
-       internal class ChildIterator : SimpleIterator
+       internal class ChildIterator : BaseIterator
        {
-               public ChildIterator (BaseIterator iter) : base (iter) {}
-               private ChildIterator (ChildIterator other) : base (other, true) {}
+               XPathNavigator _nav;
+
+               public ChildIterator (BaseIterator iter) : base (iter.NamespaceManager) 
+               {
+                       _nav = iter.CurrentPosition == 0 ? iter.PeekNext () : iter.Current;
+                       if (_nav != null && _nav.HasChildren)
+                               _nav = _nav.Clone ();
+                       else
+                               _nav = null;
+               }
+               private ChildIterator (ChildIterator other) : base (other)
+               {
+                       _nav = other._nav == null ? null : other._nav.Clone ();
+               }
+
                public override XPathNodeIterator Clone () { return new ChildIterator (this); }
+
                public override bool MoveNextCore ()
                {
-                       bool fSuccess = (CurrentPosition == 0) ? _nav.MoveToFirstChild () : _nav.MoveToNext ();
-                       if (fSuccess) {
-                               Current.MoveTo (_nav);
+                       if (_nav == null)
+                               return false;
+
+                       return (CurrentPosition == 0) ? _nav.MoveToFirstChild () : _nav.MoveToNext ();
+               }
+
+               public override XPathNavigator Current {
+                       get {
+                               if (CurrentPosition == 0)
+                                       return null;
+                               return _nav;
                        }
-                       return fSuccess;
                }
        }
 
@@ -274,7 +338,7 @@ namespace System.Xml.XPath
                        }
                        if (_nav.MoveToNext ())
                        {
-                               Current.MoveTo (_nav);
+//                             Current.MoveTo (_nav);
                                return true;
                        }
                        return false;
@@ -315,7 +379,7 @@ namespace System.Xml.XPath
 
                                _nav.MoveToFirst ();
                                if (!_nav.IsSamePosition (startPosition)) {
-                                       Current.MoveTo (_nav);
+//                                     Current.MoveTo (_nav);
                                        return true;
                                }
                        } else {
@@ -329,7 +393,7 @@ namespace System.Xml.XPath
                                finished = true;
                                return false;
                        } else {
-                               Current.MoveTo (_nav);
+//                             Current.MoveTo (_nav);
                                return true;
                        }
                }
@@ -380,7 +444,7 @@ namespace System.Xml.XPath
                        if (currentPosition == 0)
                                return false;
                        _nav.MoveTo ((XPathNavigator) navigators [--currentPosition]);
-                       Current.MoveTo (_nav);
+//                     Current.MoveTo (_nav);
                        return true;
                }
 
@@ -443,7 +507,7 @@ namespace System.Xml.XPath
                                if (startPosition.NodeType != XPathNodeType.Root) {
                                        // First time it returns Root
                                        _nav.MoveToRoot ();
-                                       Current.MoveTo (_nav);
+//                                     Current.MoveTo (_nav);
                                        return true;
                                }
                        }
@@ -451,11 +515,11 @@ namespace System.Xml.XPath
                                return false;
                        if (currentPosition-- == 0) {
                                _nav.MoveTo (startPosition);
-                               Current.MoveTo (_nav);
+//                             Current.MoveTo (_nav);
                                return true; // returns self.
                        }
                        _nav.MoveTo ((XPathNavigator) navigators [currentPosition]);
-                       Current.MoveTo (_nav);
+//                     Current.MoveTo (_nav);
                        return true;
                }
 
@@ -495,14 +559,14 @@ namespace System.Xml.XPath
                        if (_nav.MoveToFirstChild ())
                        {
                                _depth ++;
-                               Current.MoveTo (_nav);
+//                             Current.MoveTo (_nav);
                                return true;
                        }
                        while (_depth != 0)
                        {
                                if (_nav.MoveToNext ())
                                {
-                                       Current.MoveTo (_nav);
+//                                     Current.MoveTo (_nav);
                                        return true;
                                }
                                if (!_nav.MoveToParent ())      // should NEVER fail!
@@ -536,20 +600,20 @@ namespace System.Xml.XPath
                        if (CurrentPosition == 0)
                        {
                                // self
-                               Current.MoveTo (_nav);
+//                             Current.MoveTo (_nav);
                                return true;
                        }
                        if (_nav.MoveToFirstChild ())
                        {
                                _depth ++;
-                               Current.MoveTo (_nav);
+//                             Current.MoveTo (_nav);
                                return true;
                        }
                        while (_depth != 0)
                        {
                                if (_nav.MoveToNext ())
                                {
-                                       Current.MoveTo (_nav);
+//                                     Current.MoveTo (_nav);
                                        return true;
                                }
                                if (!_nav.MoveToParent ())      // should NEVER fail!
@@ -584,12 +648,12 @@ namespace System.Xml.XPath
                                default:
                                        if (_nav.MoveToNext ())
                                        {
-                                               Current.MoveTo (_nav);
+//                                             Current.MoveTo (_nav);
                                                return true;
                                        } else {
                                                while (_nav.MoveToParent ()) {
                                                        if (_nav.MoveToNext ()) {
-                                                               Current.MoveTo (_nav);
+//                                                             Current.MoveTo (_nav);
                                                                return true;
                                                        }
                                                }
@@ -601,14 +665,14 @@ namespace System.Xml.XPath
                        {
                                if (_nav.MoveToFirstChild ())
                                {
-                                       Current.MoveTo (_nav);
+//                                     Current.MoveTo (_nav);
                                        return true;
                                }
                                do
                                {
                                        if (_nav.MoveToNext ())
                                        {
-                                               Current.MoveTo (_nav);
+//                                             Current.MoveTo (_nav);
                                                return true;
                                        }
                                }
@@ -665,7 +729,7 @@ namespace System.Xml.XPath
                                finished = true;
                                return false;
                        } else {
-                               Current.MoveTo (_nav);
+//                             Current.MoveTo (_nav);
                                return true;
                        }
                }
@@ -685,13 +749,13 @@ namespace System.Xml.XPath
                        {
                                if (_nav.MoveToFirstNamespace ())
                                {
-                                       Current.MoveTo (_nav);
+//                                     Current.MoveTo (_nav);
                                        return true;
                                }
                        }
                        else if (_nav.MoveToNextNamespace ())
                        {
-                               Current.MoveTo (_nav);
+//                             Current.MoveTo (_nav);
                                return true;
                        }
                        return false;
@@ -709,13 +773,13 @@ namespace System.Xml.XPath
                        {
                                if (_nav.MoveToFirstAttribute ())
                                {
-                                       Current.MoveTo (_nav);
+//                                     Current.MoveTo (_nav);
                                        return true;
                                }
                        }
                        else if (_nav.MoveToNextAttribute ())
                        {
-                               Current.MoveTo (_nav);
+//                             Current.MoveTo (_nav);
                                return true;
                        }
                        return false;                   
@@ -724,13 +788,13 @@ namespace System.Xml.XPath
 
        internal class AxisIterator : BaseIterator
        {
-               private SimpleIterator _iter;
+               private BaseIterator _iter;
                private NodeTest _test;
                        
                //string name, ns;
                //XPathNodeType matchType;
 
-               public AxisIterator (SimpleIterator iter, NodeTest test) : base (iter.NamespaceManager)
+               public AxisIterator (BaseIterator iter, NodeTest test) : base (iter.NamespaceManager)
                {
                        _iter = iter;
                        _test = test;
@@ -744,7 +808,7 @@ namespace System.Xml.XPath
 
                private AxisIterator (AxisIterator other) : base (other)
                {
-                       _iter = (SimpleIterator) other._iter.Clone ();
+                       _iter = (BaseIterator) other._iter.Clone ();
                        _test = other._test;
                        //name = other.name;
                        //ns = other.ns;
@@ -756,14 +820,14 @@ namespace System.Xml.XPath
                {
                        while (_iter.MoveNext ())
                        {
-                               if (_test.Match (NamespaceManager, Current))
+                               if (_test.Match (NamespaceManager, _iter.Current))
                                {
                                        return true;
                                }
                        }
                        return false;
                }
-               public override XPathNavigator Current { get { return _iter.Current; }}
+               public override XPathNavigator Current { get { return CurrentPosition == 0 ? null : _iter.Current; }}
 
                public override bool ReverseAxis {
                        get { return _iter.ReverseAxis; }
@@ -814,23 +878,68 @@ namespace System.Xml.XPath
                }
        }
 
+       internal class SortedIterator : BaseIterator
+       {
+               ArrayList list;
+
+               public SortedIterator (BaseIterator iter) : base (iter.NamespaceManager)
+               {
+                       list = new ArrayList ();
+                       while (iter.MoveNext ())
+                               list.Add (iter.Current.Clone ());
+
+                       // sort
+                       if (list.Count == 0)
+                               return;
+                       XPathNavigator prev = (XPathNavigator) list [0];
+                       list.Sort (XPathNavigatorComparer.Instance);
+                       for (int i = 1; i < list.Count; i++) {
+                               XPathNavigator n = (XPathNavigator) list [i];
+                               if (prev.IsSamePosition (n)) {
+                                       list.RemoveAt (i);
+                                       i--;
+                               }
+                               else
+                                       prev = n;
+                       }
+               }
+
+               public SortedIterator (SortedIterator other) : base (other)
+               {
+                       this.list = other.list;
+                       SetPosition (other.CurrentPosition);
+               }
+
+               public override XPathNodeIterator Clone () { return new SortedIterator (this); }
+
+               public override bool MoveNextCore ()
+               {
+                       return CurrentPosition < list.Count;
+               }
+
+               public override XPathNavigator Current {
+                       get { return CurrentPosition == 0 ? null : (XPathNavigator) list [CurrentPosition - 1]; }
+               }
+
+               public override int Count {
+                       get { return list.Count; }
+               }
+       }
+
+       // NOTE: it is *not* sorted. Do not directly use it without checking sorting requirement.
        internal class SlashIterator : BaseIterator
        {
                private BaseIterator _iterLeft;
                private BaseIterator _iterRight;
                private NodeSet _expr;
-               ArrayList _navStore;
                SortedList _iterList;
                bool _finished;
                BaseIterator _nextIterRight;
 
-               public SlashIterator (BaseIterator iter, NodeSet expr, bool requireSorting) : base (iter.NamespaceManager)
+               public SlashIterator (BaseIterator iter, NodeSet expr) : base (iter.NamespaceManager)
                {
                        _iterLeft = iter;
                        _expr = expr;
-
-                       if (requireSorting)
-                               CollectResults ();
                }
 
                private SlashIterator (SlashIterator other) : base (other)
@@ -841,8 +950,6 @@ namespace System.Xml.XPath
                        _expr = other._expr;
                        if (other._iterList != null)
                                _iterList = (SortedList) other._iterList.Clone ();
-                       if (other._navStore != null)
-                               _navStore = (ArrayList) other._navStore.Clone ();
                        _finished = other._finished;
                        if (other._nextIterRight != null)
                                _nextIterRight = (BaseIterator) other._nextIterRight.Clone ();
@@ -853,24 +960,7 @@ namespace System.Xml.XPath
                {
                        if (_finished)
                                return false;
-                       if (_navStore != null) {
-                               // Which requires sorting::
-                               if (_navStore.Count < CurrentPosition + 1) {
-                                       _finished = true;
-                                       return false;
-                               }
-                               while (_navStore.Count > CurrentPosition + 1) {
-                                       if (((XPathNavigator) _navStore [CurrentPosition + 1]).IsSamePosition (
-                                               (XPathNavigator) _navStore [CurrentPosition]))
-                                               _navStore.RemoveAt (CurrentPosition + 1);
-                                       else
-                                               break;
-                               }
 
-                               return true;
-                       }
-                       // Which does not require sorting::
-                       
                        if (_iterRight == null) { // First time
                                if (!_iterLeft.MoveNext ())
                                        return false;
@@ -942,34 +1032,11 @@ namespace System.Xml.XPath
                        }
                }
 
-               private void CollectResults ()
-               {
-                       _navStore = new ArrayList ();
-                       while (true) {
-                               while (_iterRight == null || !_iterRight.MoveNext ()) {
-                                       if (!_iterLeft.MoveNext ()) {
-                                               _navStore.Sort (XPathNavigatorComparer.Instance);
-                                               return;
-                                       }
-                                       _iterRight = _expr.EvaluateNodeSet (_iterLeft);
-                               }
-                               XPathNavigator nav = _iterRight.Current;
-                               _navStore.Add (nav.Clone ());
-                       }
-               }
-
                public override XPathNavigator Current { 
                        get {
-                               if (CurrentPosition <= 0) return null;
-                               if (_navStore != null) {
-                                       return (XPathNavigator) _navStore [CurrentPosition - 1];
-                               } else {
-                                       return _iterRight.Current;
-                               }
+                               return (CurrentPosition == 0) ? null : _iterRight.Current;
                        }
                }
-
-               public override int Count { get { return _navStore == null ? base.Count : _navStore.Count; } }
        }
 
        internal class PredicateIterator : BaseIterator
@@ -1028,10 +1095,12 @@ namespace System.Xml.XPath
                        finished = true;
                        return false;
                }
-               public override XPathNavigator Current { get { return _iter.Current; }}
+               public override XPathNavigator Current {
+                       get { return CurrentPosition == 0 ? null : _iter.Current; }}
                public override bool ReverseAxis {
                        get { return _iter.ReverseAxis; }
                }
+public override string ToString () { return _iter.GetType ().FullName; }
        }
 
        internal class ListIterator : BaseIterator
@@ -1062,7 +1131,7 @@ namespace System.Xml.XPath
                }
                public override XPathNavigator Current {
                        get {
-                               if (_list.Count == 0)
+                               if (_list.Count == 0 || CurrentPosition == 0)
                                        return null;
                                return (XPathNavigator) _list [CurrentPosition - 1]; 
                        }
@@ -1147,7 +1216,7 @@ namespace System.Xml.XPath
 
                public override XPathNavigator Current
                {
-                       get { return _current; }
+                       get { return CurrentPosition > 0 ? _current : null; }
                }
        }
 
index db70fde6d44d04b6ff47226b3c7ad18ed8294980..fb0c32bfb357d630e78f65abdcc394aabfb932f2 100644 (file)
@@ -30,6 +30,7 @@
 
 using System.Collections;
 using Mono.Xml.XPath;
+using System.Xml.Xsl;
 
 #if NET_2_0
 using NSResolver = System.Xml.IXmlNamespaceResolver;
@@ -92,11 +93,14 @@ namespace System.Xml.XPath
 #endif
 
                internal static XPathExpression Compile (string xpath,
-                       NSResolver nsmgr, System.Xml.Xsl.IStaticXsltContext ctx)
+                       NSResolver nsmgr, IStaticXsltContext ctx)
                {
-                       XPathParser parser = new XPathParser (ctx);
-                       XPathExpression x = new CompiledExpression (
-                               xpath, parser.Compile (xpath));
+                       XPathExpression x = ExpressionCache.Get (xpath, ctx);
+                       if (x == null) {
+                               XPathParser parser = new XPathParser (ctx);
+                               x = new CompiledExpression (xpath, parser.Compile (xpath));
+                               ExpressionCache.Set (xpath, ctx, x);
+                       }
                        x.SetContext (nsmgr);
                        return x;
                }
index 8c23a6fba4d19b118d158ec215f7b7175cdf6975..981d06a92d66d1ec53768d0de1a320d8a44aed5c 100644 (file)
@@ -31,8 +31,8 @@
 //
 
 using System;
-#if NET_2_0
 using System.Collections;
+#if NET_2_0
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Text;
@@ -57,6 +57,43 @@ namespace System.Xml.XPath
        public abstract class XPathNavigator : ICloneable
 #endif
        {
+               class EnumerableIterator : XPathNodeIterator
+               {
+                       IEnumerable source;
+                       IEnumerator e;
+                       int pos;
+
+                       public EnumerableIterator (IEnumerable source, int pos)
+                       {
+                               this.source = source;
+                               for (int i = 0; i < pos; i++)
+                                       MoveNext ();
+                       }
+
+                       public override XPathNodeIterator Clone ()
+                       {
+                               return new EnumerableIterator (source, pos);
+                       }
+
+                       public override bool MoveNext ()
+                       {
+                               if (e == null)
+                                       e = source.GetEnumerator ();
+                               if (!e.MoveNext ())
+                                       return false;
+                               pos++;
+                               return true;
+                       }
+
+                       public override int CurrentPosition {
+                               get { return pos; }
+                       }
+
+                       public override XPathNavigator Current {
+                               get { return pos == 0 ? null : (XPathNavigator) e.Current; }
+                       }
+               }
+
                #region Static members
 #if NET_2_0
                public static IEqualityComparer NavigatorComparer {
@@ -253,8 +290,16 @@ namespace System.Xml.XPath
                {
                        return Evaluate (expr, context, null);
                }
-               
-               internal virtual object Evaluate (XPathExpression expr, XPathNodeIterator context, NSResolver ctx)
+
+               BaseIterator ToBaseIterator (XPathNodeIterator iter, NSResolver ctx)
+               {
+                       BaseIterator i = iter as BaseIterator;
+                       if (i == null)
+                               i = new WrapperIterator (iter, ctx);
+                       return i;
+               }
+
+               object Evaluate (XPathExpression expr, XPathNodeIterator context, NSResolver ctx)
                {
                        CompiledExpression cexpr = (CompiledExpression) expr;
                        if (ctx == null)
@@ -262,7 +307,7 @@ namespace System.Xml.XPath
                        
                        if (context == null)
                                context = new NullIterator (this, ctx);
-                       BaseIterator iterContext = (BaseIterator) context;
+                       BaseIterator iterContext = ToBaseIterator (context, ctx);
                        iterContext.NamespaceManager = ctx;
                        return cexpr.Evaluate (iterContext);
                }
@@ -275,7 +320,7 @@ namespace System.Xml.XPath
                        
                        if (context == null)
                                context = new NullIterator (this, cexpr.NamespaceManager);
-                       BaseIterator iterContext = (BaseIterator) context;
+                       BaseIterator iterContext = ToBaseIterator (context, ctx);
                        iterContext.NamespaceManager = ctx;
                        return cexpr.EvaluateNodeSet (iterContext);
                }
@@ -288,8 +333,7 @@ namespace System.Xml.XPath
                        
                        if (context == null)
                                context = new NullIterator (this, cexpr.NamespaceManager);
-                       BaseIterator iterContext = (BaseIterator) context;
-                       iterContext.NamespaceManager = ctx;
+                       BaseIterator iterContext = ToBaseIterator (context, ctx);
                        return cexpr.EvaluateString (iterContext);
                }
 
@@ -301,7 +345,7 @@ namespace System.Xml.XPath
                        
                        if (context == null)
                                context = new NullIterator (this, cexpr.NamespaceManager);
-                       BaseIterator iterContext = (BaseIterator) context;
+                       BaseIterator iterContext = ToBaseIterator (context, ctx);
                        iterContext.NamespaceManager = ctx;
                        return cexpr.EvaluateNumber (iterContext);
                }
@@ -314,7 +358,7 @@ namespace System.Xml.XPath
                        
                        if (context == null)
                                context = new NullIterator (this, cexpr.NamespaceManager);
-                       BaseIterator iterContext = (BaseIterator) context;
+                       BaseIterator iterContext = ToBaseIterator (context, ctx);
                        iterContext.NamespaceManager = ctx;
                        return cexpr.EvaluateBoolean (iterContext);
                }
@@ -550,7 +594,7 @@ namespace System.Xml.XPath
                        return Select (expr, null);
                }
                
-               internal virtual XPathNodeIterator Select (XPathExpression expr, NSResolver ctx)
+               internal XPathNodeIterator Select (XPathExpression expr, NSResolver ctx)
                {
                        CompiledExpression cexpr = (CompiledExpression) expr;
                        if (ctx == null)
@@ -578,9 +622,50 @@ namespace System.Xml.XPath
                        return SelectTest (new NodeNameTest (axis, qname, true));
                }
 
+               static IEnumerable EnumerateChildren (XPathNavigator n, XPathNodeType type)
+               {
+                       if (!n.MoveToFirstChild ())
+                               yield break;
+                       n.MoveToParent ();
+                       XPathNavigator nav = n.Clone ();
+                       nav.MoveToFirstChild ();
+                       XPathNavigator nav2 = null;
+                       do {
+                               if (type == XPathNodeType.All || nav.NodeType == type) {
+                                       if (nav2 == null)
+                                               nav2 = nav.Clone ();
+                                       else
+                                               nav2.MoveTo (nav);
+                                       yield return nav2;
+                               }
+                       } while (nav.MoveToNext ());
+               }
+
                public virtual XPathNodeIterator SelectChildren (XPathNodeType type)
                {
+#if false
                        return SelectTest (new NodeTypeTest (Axes.Child, type));
+#else
+                       return new WrapperIterator (new EnumerableIterator (EnumerateChildren (this, type), 0), null);
+                       // FIXME: make it work i.e. remove dependency on BaseIterator
+//                     return new EnumerableIterator (EnumerateChildren (this, type), 0);
+#endif
+               }
+
+               static IEnumerable EnumerateChildren (XPathNavigator n, string name, string ns)
+               {
+                       if (!n.MoveToFirstChild ())
+                               yield break;
+                       n.MoveToParent ();
+                       XPathNavigator nav = n.Clone ();
+                       nav.MoveToFirstChild ();
+                       XPathNavigator nav2 = nav.Clone ();
+                       do {
+                               if (nav.LocalName == name && nav.NamespaceURI == ns) {
+                                       nav2.MoveTo (nav);
+                                       yield return nav2;
+                               }
+                       } while (nav.MoveToNext ());
                }
 
                public virtual XPathNodeIterator SelectChildren (string name, string namespaceURI)
@@ -590,9 +675,13 @@ namespace System.Xml.XPath
                        if (namespaceURI == null)
                                throw new ArgumentNullException ("namespaceURI");
 
+#if false
                        Axes axis = Axes.Child;
                        XmlQualifiedName qname = new XmlQualifiedName (name, namespaceURI);
                        return SelectTest (new NodeNameTest (axis, qname, true));
+#else
+                       return new WrapperIterator (new EnumerableIterator (EnumerateChildren (this, name, namespaceURI), 0), null);
+#endif
                }
 
                public virtual XPathNodeIterator SelectDescendants (XPathNodeType type, bool matchSelf)
index 6a38f660fc7913c7312629cf739e2cedf9a3ea53..3d914022b3d1ca163568430d66771aaa12293edc 100644 (file)
@@ -2,6 +2,11 @@
 
        * XmlTextReader.cs : simply call ClearValueBuffer() on each Read().
 
+2008-10-02  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XmlDocumentNavigator.cs : added some overriden methods (to be
+         implemented).
+
 2008-09-24  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XmlDocument.cs : it returns non-null Schemas by default (and
index 503697761da205c50588139a8adcbff7f32e1a5d..6a8e78ccf049e585ed670652d670f43a141ec299 100644 (file)
@@ -656,7 +656,8 @@ namespace System.Xml
                                                if (ec != null)
                                                        return ec;
                                        }
-                                       return c;
+                                       else
+                                               return c;
                                }
                                return null;
                        default:
@@ -679,7 +680,8 @@ namespace System.Xml
                                                if (ec != null)
                                                        return ec;
                                        }
-                                       return c;
+                                       else
+                                               return c;
                                }
                                return null;
                        default:
@@ -745,6 +747,95 @@ namespace System.Xml
                        return null;
                }
 
+#if NET_2_0
+               public
+#else
+               internal
+#endif
+               override string LookupNamespace (string prefix)
+               {
+                       // FIXME: optimize
+                       return base.LookupNamespace (prefix);
+               }
+
+#if NET_2_0
+               public
+#else
+               internal
+#endif
+               override string LookupPrefix (string namespaceUri)
+               {
+                       // FIXME: optimize
+                       return base.LookupPrefix (namespaceUri);
+               }
+
+#if NET_2_0
+               public
+#else
+               internal
+#endif
+               override bool MoveToChild (XPathNodeType type)
+               {
+                       // FIXME: optimize
+                       return base.MoveToChild (type);
+               }
+
+#if NET_2_0
+               public
+#else
+               internal
+#endif
+               override bool MoveToChild (string localName, string namespaceURI)
+               {
+                       // FIXME: optimize
+                       return base.MoveToChild (localName, namespaceURI);
+               }
+
+#if NET_2_0
+               public
+#else
+               internal
+#endif
+               override bool MoveToNext (string localName, string namespaceURI)
+               {
+                       // FIXME: optimize
+                       return base.MoveToNext (localName, namespaceURI);
+               }
+
+#if NET_2_0
+               public
+#else
+               internal
+#endif
+               override bool MoveToNext (XPathNodeType type)
+               {
+                       // FIXME: optimize
+                       return base.MoveToNext (type);
+               }
+
+#if NET_2_0
+               public
+#else
+               internal
+#endif
+               override bool MoveToFollowing (string localName,
+                       string namespaceURI, XPathNavigator end)
+               {
+                       // FIXME: optimize
+                       return base.MoveToFollowing (localName, namespaceURI, end);
+               }
+
+#if NET_2_0
+               public
+#else
+               internal
+#endif
+               override bool MoveToFollowing (XPathNodeType type,
+                       XPathNavigator end)
+               {
+                       // FIXME: optimize
+                       return base.MoveToFollowing (type, end);
+               }
                #endregion
        }
 }
index 3ee89b5f264b9574d746882605b304b374434b5a..831d4b3e07fdfb9d93a81e18321cda8c8101a0c2 100644 (file)
@@ -1,3 +1,8 @@
+2008-10-02  Atsushi Enomoto <atsushi@ximian.com>
+
+       * XPathNavigatorEvaluateTests.cs : corrected couple of misconception
+         in the tests.
+
 2008-04-02  Atsushi Enomoto <atsushi@ximian.com>
 
        * XPathEditableNavigatorTests.cs : added test for bug #376210.
index 0d8f70aa9f1882cfe6749d7ab7379282950fa0e1..359ba7197acc7c52c736506d98c86d1679a1cea4 100644 (file)
@@ -47,18 +47,20 @@ namespace MonoTests.System.Xml
 
                // Testing Core Funcetion Library functions defined at: http://www.w3.org/TR/xpath#corelib
                [Test]
-#if NET_2_0
+#if !NET_2_0
                // .NET 2.0 is fixed for last() to return 1 for the
-               // initial context position. We should follow the fix.
-               [Category ("NotWorking")]
+               // initial context position. Someone thinks we should follow
+               // the fix, but in reality we should just discard this
+               // pointless test. The positional value under those conditions
+               // does not make any sense.
                [Category ("NotDotNet")]
 #endif
                public void CoreFunctionNodeSetLast ()
                {
                        expression = navigator.Compile("last()");
                        iterator = navigator.Select("/foo");
-                       AssertEquals ("0", navigator.Evaluate ("last()").ToString());
-                       AssertEquals ("0", navigator.Evaluate (expression, null).ToString ());
+                       AssertEquals ("1", navigator.Evaluate ("last()").ToString());
+                       AssertEquals ("1", navigator.Evaluate (expression, null).ToString ());
                        AssertEquals ("1", navigator.Evaluate (expression, iterator).ToString ());
                        iterator = navigator.Select("/foo/*");
                        AssertEquals ("4", navigator.Evaluate (expression, iterator).ToString ());
@@ -67,18 +69,21 @@ namespace MonoTests.System.Xml
                }
 
                [Test]
-#if NET_2_0
+#if !NET_2_0
                // .NET 2.0 is fixed for position() to return 1 for the
-               // initial context position. We should follow the fix.
-               [Category ("NotWorking")]
+               // initial context position. Someone thinks we should follow
+               // the fix, but in reality we should just discard this
+               // pointless test. The positional value under those conditions
+               // does not make any sense.
+//             [Category ("NotWorking")]
                [Category ("NotDotNet")]
 #endif
                public void CoreFunctionNodeSetPosition ()
                {
                        expression = navigator.Compile("position()");
                        iterator = navigator.Select("/foo");
-                       AssertEquals ("#1", "0", navigator.Evaluate ("position()").ToString ());
-                       AssertEquals ("#2", "0", navigator.Evaluate (expression, null).ToString ());
+                       AssertEquals ("#1", "1", navigator.Evaluate ("position()").ToString ());
+                       AssertEquals ("#2", "1", navigator.Evaluate (expression, null).ToString ());
                        AssertEquals ("#3", "0", navigator.Evaluate (expression, iterator).ToString ());
                        iterator = navigator.Select("/foo/*");
                        AssertEquals ("#4", "0", navigator.Evaluate (expression, iterator).ToString ());
index 725f3a2f62c3f767196c1483d5a73262dd76d85a..87c24749b157b81d6e48fa122597cde09f69f2dd 100644 (file)
@@ -1,3 +1,7 @@
+2008-10-02  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XslTransformTests.cs : removed extra NotDotNet.
+
 2008-06-04  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XslTransformTests.cs : added test for bug #378239.
index cc2ab563bd0920ae3abc2339283c420393e5db34..60ac63792765beb2fcae7409df79cce2f498a291 100644 (file)
@@ -2243,6 +2243,7 @@ World";
 
                [Test] // reverse case of #349375
                [Category ("NotWorking")]
+//             [Category ("NotDotNet")]
                public void PreserveWhitespace2 ()
                {
                        XslCompiledTransform xslt = new XslCompiledTransform ();
@@ -2291,7 +2292,8 @@ World";
     </p>
   </l0>
 </root>")), null, sw);
-                       Assert.AreEqual (@"<y><t yes-one-node="""">1</t><t not-node=""""></t></y>", sw.ToString ());
+//                     Assert.AreEqual (@"<y><t yes-one-node="""">1</t><t not-node=""""></t></y>", sw.ToString ());
+                       Assert.AreEqual ("\r\n  \r\n    <y><t yes-one-node=\"\">1</t><t not-node=\"\"></t></y>\r\n  \r\n", sw.ToString ());
                }
 
                [Test]
index 52d7755b0538cd2b7f917708ed2a6161fb5d2c7e..b83c2c9f6b690bf0fc0106ccebf53875f1d6d7c7 100644 (file)
@@ -1,3 +1,7 @@
+2008-10-02  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * Makefile : fixed couple of obsolete settings.
+
 2008-06-04  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XsltTestUtils.cs : fixed incorrect use of EnvOptions.WhitespaceStyle
index 9930b43817efff94ec80512ef7cbb80d544c1b9d..2186adc2da3356304770750fc9b370668181b0f4 100644 (file)
@@ -14,7 +14,7 @@ RUNTIME = mono
 
 ifeq ($(PROFILE), net_2_0)
        nunit_MONO_PATH="../../../../../class/lib/net_2_0"
-       CSCOMPILE=gmcs
+       CSCOMPILE=MONO_PATH=../../../../../class/lib/net_2_0 ../../../../../../mono/runtime/mono-wrapper ../../../../../class/lib/net_2_0/gmcs.exe
 else
        nunit_MONO_PATH="../../../../../class/lib/net_1_1"
        CSCOMPILE=mcs
@@ -25,7 +25,7 @@ CATALOG = testsuite/TESTS/catalog.xml
 FIXED_CATALOG = testsuite/TESTS/catalog-fixed.xml
 
 mono_wrapper_PATH="../../../../../../mono/runtime/mono-wrapper"
-NUNIT_CONSOLE=$(mono_wrapper_PATH) --debug nunit-console.exe
+NUNIT_CONSOLE=$(mono_wrapper_PATH) --debug ./nunit-console.exe
 
 FIXTURE=MonoTests.oasis_xslt.SuiteBuilder
 CLEAN_NUNIT_FLAGS=/fixture:$(FIXTURE) /xml=TestResult.xml /include=Clean
@@ -41,7 +41,7 @@ else
 REFERENCE_RESULTS_NAME=results
 endif
 REFERENCE_RESULTS_ARCHIVE=xslt-reference-$(REFERENCE_RESULTS_NAME).tar.gz
-REFERENCE_RESULTS_URL=http://svn.myrealbox.com/source/trunk/release/test-ext/xslt-standalone/$(REFERENCE_RESULTS_ARCHIVE)
+REFERENCE_RESULTS_URL=http://anonsvn.mono-project.com/source/trunk/release/test-ext/xslt-standalone/$(REFERENCE_RESULTS_ARCHIVE)
 REFERENCE_RESULTS=$(REFERENCE_RESULTS_NAME)/timestamp
 
 test : $(TEST_PROG) $(FIXED_CATALOG) $(REFERENCE_RESULTS)
@@ -114,5 +114,5 @@ $(REFERENCE_RESULTS) : $(REFERENCE_RESULTS_ARCHIVE)
        touch $@
 
 $(REFERENCE_RESULTS_ARCHIVE) :
-       wget $(REFERENCE_RESULTS_URL)
+       wget -O $(REFERENCE_RESULTS_ARCHIVE) $(REFERENCE_RESULTS_URL)