diff options
author | Atsushi Eno <atsushieno@gmail.com> | 2008-11-13 16:05:44 +0300 |
---|---|---|
committer | Atsushi Eno <atsushieno@gmail.com> | 2008-11-13 16:05:44 +0300 |
commit | e30d02ad834964a3f5d812e3e85a375d219b3e1c (patch) | |
tree | 19402c838b6fafb2216b6483eded0bfd0ced7099 /mcs/class/System.XML/Mono.Xml.Xsl | |
parent | e2a08e4a6167a5a69cbc296bf46aec7af157d472 (diff) |
merge XPath optimization branch. About 15% faster/less memory use so
far.
svn path=/trunk/mcs/; revision=118710
Diffstat (limited to 'mcs/class/System.XML/Mono.Xml.Xsl')
5 files changed, 68 insertions, 11 deletions
diff --git a/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog b/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog index 3c9c535b38d..bec6e14e627 100644 --- a/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog +++ b/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog @@ -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. diff --git a/mcs/class/System.XML/Mono.Xml.Xsl/GenericOutputter.cs b/mcs/class/System.XML/Mono.Xml.Xsl/GenericOutputter.cs index 79c7259956f..d7571a9c59f 100644 --- a/mcs/class/System.XML/Mono.Xml.Xsl/GenericOutputter.cs +++ b/mcs/class/System.XML/Mono.Xml.Xsl/GenericOutputter.cs @@ -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); } diff --git a/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs b/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs index 6b280b94592..7cc29aad08e 100644 --- a/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs +++ b/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs @@ -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); diff --git a/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs b/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs index 7b8b64a8001..d3f1103ff83 100644 --- a/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs +++ b/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs @@ -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) diff --git a/mcs/class/System.XML/Mono.Xml.Xsl/XslTransformProcessor.cs b/mcs/class/System.XML/Mono.Xml.Xsl/XslTransformProcessor.cs index 81b885991c3..a4a8f6c602e 100644 --- a/mcs/class/System.XML/Mono.Xml.Xsl/XslTransformProcessor.cs +++ b/mcs/class/System.XML/Mono.Xml.Xsl/XslTransformProcessor.cs @@ -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 |