Optimize
authorBen Maurer <benm@mono-cvs.ximian.com>
Sun, 7 Sep 2003 19:40:30 +0000 (19:40 -0000)
committerBen Maurer <benm@mono-cvs.ximian.com>
Sun, 7 Sep 2003 19:40:30 +0000 (19:40 -0000)
svn path=/trunk/mcs/; revision=17979

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

index 295d4009bb442017c0abe04cf1786a59b5d25835..256ff23f0d6b20e3296e019fd1b7eec034c2a049 100644 (file)
@@ -141,6 +141,14 @@ namespace System.Xml.XPath
                {
                        return (double) arg0.EvaluateNodeSet (iter).Count;
                }
+               
+               public override bool EvaluateBoolean (BaseIterator iter)
+               {
+                       if (arg0.GetReturnType (iter) == XPathResultType.NodeSet)
+                               return arg0.EvaluateBoolean (iter);
+                       
+                       return arg0.EvaluateNodeSet (iter).MoveNext ();
+               }
        }
 
 
index 44384999c4a5312f6c1f5447264bccf755880cea..f72ea0af6e95cf4148226f480f2dc05a3ad85fdc 100644 (file)
@@ -328,7 +328,7 @@ namespace System.Xml.XPath
                public virtual XPathResultType GetReturnType (BaseIterator iter) { return ReturnType; }
                public abstract object Evaluate (BaseIterator iter);
 
-               public BaseIterator EvaluateNodeSet (BaseIterator iter)
+               public virtual BaseIterator EvaluateNodeSet (BaseIterator iter)
                {
                        XPathResultType type = GetReturnType (iter);
                        if (type == XPathResultType.NodeSet ||
@@ -354,7 +354,7 @@ namespace System.Xml.XPath
                        throw new XPathException ("invalid node type: "+obj.GetType ().ToString ());
                }
                [MonoTODO]
-               public double EvaluateNumber (BaseIterator iter)
+               public virtual double EvaluateNumber (BaseIterator iter)
                {
                        object result;
                        XPathResultType type = GetReturnType (iter);
@@ -384,7 +384,7 @@ namespace System.Xml.XPath
                        }
                }
                [MonoTODO]
-               public string EvaluateString (BaseIterator iter)
+               public virtual string EvaluateString (BaseIterator iter)
                {
                        object result = Evaluate (iter);
                        XPathResultType type = GetReturnType (iter);
@@ -410,7 +410,7 @@ namespace System.Xml.XPath
                        }
                }
                [MonoTODO]
-               public bool EvaluateBoolean (BaseIterator iter)
+               public virtual bool EvaluateBoolean (BaseIterator iter)
                {
                        object result = Evaluate (iter);
                        XPathResultType type = GetReturnType (iter);
@@ -473,13 +473,17 @@ namespace System.Xml.XPath
        {
                public ExprBoolean (Expression left, Expression right) : base (left, right) {}
                public override XPathResultType ReturnType { get { return XPathResultType.Boolean; }}
+               public override object Evaluate (BaseIterator iter)
+               {
+                       return EvaluateBoolean (iter);
+               }
        }
 
        internal class ExprOR : ExprBoolean
        {
                public ExprOR (Expression left, Expression right) : base (left, right) {}
                protected override String Operator { get { return "or"; }}
-               public override object Evaluate (BaseIterator iter)
+               public override bool EvaluateBoolean (BaseIterator iter)
                {
                        if (_left.EvaluateBoolean (iter))
                                return true;
@@ -491,7 +495,7 @@ namespace System.Xml.XPath
        {
                public ExprAND (Expression left, Expression right) : base (left, right) {}
                protected override String Operator { get { return "and"; }}
-               public override object Evaluate (BaseIterator iter)
+               public override bool EvaluateBoolean (BaseIterator iter)
                {
                        if (!_left.EvaluateBoolean (iter))
                                return false;
@@ -503,7 +507,7 @@ namespace System.Xml.XPath
        {
                public EqualityExpr (Expression left, Expression right) : base (left, right) {}
                [MonoTODO]
-               public override object Evaluate (BaseIterator iter)
+               public override bool EvaluateBoolean (BaseIterator iter)
                {
                        XPathResultType typeL = _left.GetReturnType (iter);
                        XPathResultType typeR = _right.GetReturnType (iter);
@@ -605,7 +609,7 @@ namespace System.Xml.XPath
        {
                public RelationalExpr (Expression left, Expression right) : base (left, right) {}
                [MonoTODO]
-               public override object Evaluate (BaseIterator iter)
+               public override bool EvaluateBoolean (BaseIterator iter)
                {
                        XPathResultType typeL = _left.GetReturnType (iter);
                        XPathResultType typeR = _right.GetReturnType (iter);
@@ -724,13 +728,18 @@ namespace System.Xml.XPath
        {
                public ExprNumeric (Expression left, Expression right) : base (left, right) {}
                public override XPathResultType ReturnType { get { return XPathResultType.Number; }}
+               
+               public override object Evaluate (BaseIterator iter)
+               {
+                       return EvaluateNumber (iter);
+               }
        }
 
        internal class ExprPLUS : ExprNumeric
        {
                public ExprPLUS (Expression left, Expression right) : base (left, right) {}
                protected override String Operator { get { return "+"; }}
-               public override object Evaluate (BaseIterator iter)
+               public override double EvaluateNumber (BaseIterator iter)
                {
                        return _left.EvaluateNumber (iter) + _right.EvaluateNumber (iter);
                }
@@ -740,7 +749,7 @@ namespace System.Xml.XPath
        {
                public ExprMINUS (Expression left, Expression right) : base (left, right) {}
                protected override String Operator { get { return "-"; }}
-               public override object Evaluate (BaseIterator iter)
+               public override double EvaluateNumber (BaseIterator iter)
                {
                        return _left.EvaluateNumber (iter) - _right.EvaluateNumber (iter);
                }
@@ -750,7 +759,7 @@ namespace System.Xml.XPath
        {
                public ExprMULT (Expression left, Expression right) : base (left, right) {}
                protected override String Operator { get { return "*"; }}
-               public override object Evaluate (BaseIterator iter)
+               public override double EvaluateNumber (BaseIterator iter)
                {
                        return _left.EvaluateNumber (iter) * _right.EvaluateNumber (iter);
                }
@@ -760,7 +769,7 @@ namespace System.Xml.XPath
        {
                public ExprDIV (Expression left, Expression right) : base (left, right) {}
                protected override String Operator { get { return " div "; }}
-               public override object Evaluate (BaseIterator iter)
+               public override double EvaluateNumber (BaseIterator iter)
                {
                        return _left.EvaluateNumber (iter) / _right.EvaluateNumber (iter);
                }
@@ -771,7 +780,7 @@ namespace System.Xml.XPath
                public ExprMOD (Expression left, Expression right) : base (left, right) {}
                protected override String Operator { get { return "%"; }}
                [MonoTODO]
-               public override object Evaluate (BaseIterator iter)
+               public override double EvaluateNumber (BaseIterator iter)
                {
                        return _left.EvaluateNumber (iter) % _right.EvaluateNumber (iter);      // TODO: spec?
                }
@@ -790,6 +799,11 @@ namespace System.Xml.XPath
                {
                        return - _expr.EvaluateNumber (iter);
                }
+               
+               public override double EvaluateNumber (BaseIterator iter)
+               {
+                       return - _expr.EvaluateNumber (iter);
+               }
        }
 
 
@@ -1163,6 +1177,11 @@ namespace System.Xml.XPath
                {
                        return _value;
                }
+               
+               public override double EvaluateNumber (BaseIterator iter)
+               {
+                       return _value;
+               }
        }
 
        internal class ExprLiteral : Expression
@@ -1178,6 +1197,11 @@ namespace System.Xml.XPath
                {
                        return _value;
                }
+               
+               public override string EvaluateString (BaseIterator iter)
+               {
+                       return _value;
+               }
        }
 
        internal class ExprVariable : Expression
index 19c54d41b706d555d8923cf83125b29a97993209..a8380a1f761903f0e3ac120561122c3c12f74abc 100644 (file)
@@ -485,11 +485,13 @@ namespace System.Xml.XPath
                protected BaseIterator _iter;
                protected Expression _pred;
                protected int _pos;
+               protected XPathResultType resType;
 
                public PredicateIterator (BaseIterator iter, Expression pred) : base (iter)
                {
                        _iter = iter;
                        _pred = pred;
+                       resType = pred.GetReturnType (iter);
                }
 
                protected PredicateIterator (PredicateIterator other) : base (other)
@@ -497,6 +499,7 @@ namespace System.Xml.XPath
                        _iter = (BaseIterator) other._iter.Clone ();
                        _pred = other._pred;
                        _pos = other._pos;
+                       resType = other.resType;
                }
                public override XPathNodeIterator Clone () { return new PredicateIterator (this); }
 
@@ -505,14 +508,28 @@ namespace System.Xml.XPath
                        while (_iter.MoveNext ())
                        {
                                bool fTrue = true;
-                               object result = _pred.Evaluate ((BaseIterator) _iter.Clone ());
-                               if (result is double)
-                               {
-                                       if ((double) result != _iter.CurrentPosition)
-                                               continue;
+                               
+                               switch (resType) {
+                                       case XPathResultType.Number:
+                                               if (_pred.EvaluateNumber (_iter) != _iter.CurrentPosition)
+                                                       continue;
+                                               break;
+                                       case XPathResultType.Any: {
+                                               object result = _pred.Evaluate (_iter);
+                                               if (result is double)
+                                               {
+                                                       if ((double) result != _iter.CurrentPosition)
+                                                               continue;
+                                               }
+                                               else if (!XPathFunctions.ToBoolean (result))
+                                                       continue;
+                                       }
+                                               break;
+                                       default:
+                                               if (!_pred.EvaluateBoolean (_iter))
+                                                       continue;
+                                               break;
                                }
-                               else if (!XPathFunctions.ToBoolean (result))
-                                       continue;
 
                                _pos ++;
                                return true;