private ExprSequenceIterator (ExprSequenceIterator other) : base (other) { if (other.iter != null) iter = other.iter.Clone (); expr = other.expr; contextSequence = other.contextSequence; currentExprIndex = other.currentExprIndex; }
public override XPathSequence Evaluate (XPathSequence iter, ExprSequence args) { for (int i = 0; i < Args.Length; i++) iter.Context.PushVariable (Args [i].Name, args [i].Evaluate (iter)); XPathSequence seq = new ExprSequenceIterator (iter, expr); for (int i = 0; i < Args.Length; i++) iter.Context.PopVariable (); return seq; }
public override XPathSequence Evaluate (XPathSequence iter) { // FIXME: should move to iterator? XPathSequence cond = new ExprSequenceIterator (iter, SwitchExpr); XPathSequence ret = null; foreach (CaseClause ccc in Cases) { if (ccc.Type.Matches (cond)) { if (ccc.VarName != XmlQualifiedName.Empty) iter.Context.PushVariable (ccc.VarName, cond); ret = ccc.Expr.Evaluate (iter); // FIXME: The design should make sure that in-scope variables are held on actual iteration. if (ccc.VarName != XmlQualifiedName.Empty) iter.Context.PopVariable (); return ret; } } if (DefaultVarName != XmlQualifiedName.Empty) iter.Context.PushVariable (DefaultVarName, cond); ret = DefaultReturn.Evaluate (iter); if (DefaultVarName != XmlQualifiedName.Empty) iter.Context.PopVariable (); return ret; }