diff options
author | Atsushi Eno <atsushieno@gmail.com> | 2005-03-22 15:32:31 +0300 |
---|---|---|
committer | Atsushi Eno <atsushieno@gmail.com> | 2005-03-22 15:32:31 +0300 |
commit | e6503839bbdc27a3ffe99d62a39e4d32f26fdac2 (patch) | |
tree | b4bb4ef551c46a084fbabe284691ed8b7600f748 /mcs/class/System.XML/Mono.Xml.Xsl | |
parent | fd33ebbc47e34fbc0a35ab8b0a584907a88c5a3d (diff) |
2005-03-22 Atsushi Enomoto <atsushi@ximian.com>
* IdPattern.cs, LocationPathPattern.cs :
Use XsltCompiledContext.GetNavCache() that returns reusable
navigator cache for each pattern, to avoid Clone() and not to leave
reference to already-done instance navigator.
* XslTransformProcessor.cs : now it looks safe to remove SetContext()
from each EvaluateXXX() methods.
* MsxslScriptManager.cs : not to leave reference to stylesheet
navigator, pass current node to Compile().
* XslCompiledContext.cs : Added GetNavCache() that returns reusable
navigator cache for each pattern, to avoid Clone() and not to leave
reference to already-done instance navigator.
svn path=/trunk/mcs/; revision=42101
Diffstat (limited to 'mcs/class/System.XML/Mono.Xml.Xsl')
4 files changed, 24 insertions, 13 deletions
diff --git a/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog b/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog index 1b43f5ad841..d96590bb1f9 100644 --- a/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog +++ b/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog @@ -1,5 +1,15 @@ 2005-03-22 Atsushi Enomoto <atsushi@ximian.com> + * XslTransformProcessor.cs : now it looks safe to remove SetContext() + from each EvaluateXXX() methods. + * MsxslScriptManager.cs : not to leave reference to stylesheet + navigator, pass current node to Compile(). + * XslCompiledContext.cs : Added GetNavCache() that returns reusable + navigator cache for each pattern, to avoid Clone() and not to leave + reference to already-done instance navigator. + +2005-03-22 Atsushi Enomoto <atsushi@ximian.com> + * Compiler.cs : Now it holds XPath parser and XSLT pattern parser. * XslKey.cs : Use XSLT pattern parser for match. UsePattern is now "Use" (it is not a pattern). diff --git a/mcs/class/System.XML/Mono.Xml.Xsl/MSXslScriptManager.cs b/mcs/class/System.XML/Mono.Xml.Xsl/MSXslScriptManager.cs index d5755b161b7..c37bc42fc3c 100644 --- a/mcs/class/System.XML/Mono.Xml.Xsl/MSXslScriptManager.cs +++ b/mcs/class/System.XML/Mono.Xml.Xsl/MSXslScriptManager.cs @@ -55,7 +55,7 @@ namespace Mono.Xml.Xsl { string ns = c.Input.GetNamespace (s.ImplementsPrefix); if (ns == null) throw new XsltCompileException ("Specified prefix for msxsl:script was not found: " + s.ImplementsPrefix, null, c.Input); - scripts.Add (ns, s.Compile ()); + scripts.Add (ns, s.Compile (c.Input)); } enum ScriptingLanguage { @@ -75,12 +75,10 @@ namespace Mono.Xml.Xsl { ScriptingLanguage language = ScriptingLanguage.JScript; // default = JScript. string implementsPrefix = null; string code = null; - XPathNavigator node; Evidence evidence; public MSXslScript (XPathNavigator nav, Evidence evidence) { - node = nav.Clone (); this.evidence = evidence; code = nav.Value; if (nav.MoveToFirstAttribute ()) { @@ -127,7 +125,7 @@ namespace Mono.Xml.Xsl { get { return code; } } - public object Compile () + public object Compile (XPathNavigator node) { string suffix = Guid.NewGuid ().ToString ().Replace ("-", String.Empty); switch (this.language) { diff --git a/mcs/class/System.XML/Mono.Xml.Xsl/XslTransformProcessor.cs b/mcs/class/System.XML/Mono.Xml.Xsl/XslTransformProcessor.cs index 872cad64a4f..73cdaedd838 100644 --- a/mcs/class/System.XML/Mono.Xml.Xsl/XslTransformProcessor.cs +++ b/mcs/class/System.XML/Mono.Xml.Xsl/XslTransformProcessor.cs @@ -466,8 +466,6 @@ namespace Mono.Xml.Xsl { public object Evaluate (XPathExpression expr) { expr = CompiledStyle.ExpressionStore.PrepForExecution (expr, this); - expr.SetContext (XPathContext); - XPathNodeIterator itr = CurrentNodeset; return itr.Current.Evaluate (expr, itr, XPathContext); } @@ -475,8 +473,6 @@ namespace Mono.Xml.Xsl { public string EvaluateString (XPathExpression expr) { expr = CompiledStyle.ExpressionStore.PrepForExecution (expr, this); - expr.SetContext (XPathContext); - XPathNodeIterator itr = CurrentNodeset; return itr.Current.EvaluateString (expr, itr, XPathContext); } @@ -484,8 +480,6 @@ namespace Mono.Xml.Xsl { public bool EvaluateBoolean (XPathExpression expr) { expr = CompiledStyle.ExpressionStore.PrepForExecution (expr, this); - expr.SetContext (XPathContext); - XPathNodeIterator itr = CurrentNodeset; return itr.Current.EvaluateBoolean (expr, itr, XPathContext); } @@ -493,8 +487,6 @@ namespace Mono.Xml.Xsl { public double EvaluateNumber (XPathExpression expr) { expr = CompiledStyle.ExpressionStore.PrepForExecution (expr, this); - expr.SetContext (XPathContext); - XPathNodeIterator itr = CurrentNodeset; return itr.Current.EvaluateNumber (expr, itr, XPathContext); } @@ -502,7 +494,6 @@ namespace Mono.Xml.Xsl { public XPathNodeIterator Select (XPathExpression expr) { expr = CompiledStyle.ExpressionStore.PrepForExecution (expr, this); - expr.SetContext (XPathContext); return CurrentNodeset.Current.Select (expr, XPathContext); } diff --git a/mcs/class/System.XML/Mono.Xml.Xsl/XsltCompiledContext.cs b/mcs/class/System.XML/Mono.Xml.Xsl/XsltCompiledContext.cs index 34ee18e2f48..0362b3b69bf 100644 --- a/mcs/class/System.XML/Mono.Xml.Xsl/XsltCompiledContext.cs +++ b/mcs/class/System.XML/Mono.Xml.Xsl/XsltCompiledContext.cs @@ -59,6 +59,7 @@ namespace Mono.Xml.Xsl Hashtable keyNameCache = new Hashtable (); Hashtable keyIndexTables = new Hashtable (); + Hashtable patternNavCaches = new Hashtable (); XslTransformProcessor p; XsltContextInfo [] scopes = new XsltContextInfo [40]; @@ -74,6 +75,17 @@ namespace Mono.Xml.Xsl public override string DefaultNamespace { get { return String.Empty; }} + public XPathNavigator GetNavCache (Mono.Xml.XPath.Pattern p, XPathNavigator node) + { + XPathNavigator nav = + patternNavCaches [p] as XPathNavigator; + if (nav == null || !nav.MoveTo (node)) { + nav = node.Clone (); + patternNavCaches [p] = nav; + } + return nav; + } + public object EvaluateKey (IStaticXsltContext staticContext, BaseIterator iter, Expression nameExpr, Expression valueExpr) |