Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAtsushi Eno <atsushieno@gmail.com>2008-11-13 16:05:44 +0300
committerAtsushi Eno <atsushieno@gmail.com>2008-11-13 16:05:44 +0300
commite30d02ad834964a3f5d812e3e85a375d219b3e1c (patch)
tree19402c838b6fafb2216b6483eded0bfd0ced7099 /mcs/class/System.XML/Mono.Xml.Xsl
parente2a08e4a6167a5a69cbc296bf46aec7af157d472 (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')
-rw-r--r--mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog13
-rw-r--r--mcs/class/System.XML/Mono.Xml.Xsl/GenericOutputter.cs6
-rw-r--r--mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs5
-rw-r--r--mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs2
-rw-r--r--mcs/class/System.XML/Mono.Xml.Xsl/XslTransformProcessor.cs53
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