protected override object DoEvaluate(ScriptThread thread) { // standard prolog thread.CurrentNode = this; object result = null; // is this variable a part of a pattern? if (UseType == NodeUseType.Name) { // don't evaluate it result = CreateVariable(); } else { // get last recognized pattern var pattern = thread.GetLastPattern(); if (pattern == null) { thread.ThrowScriptError("No pattern recognized!"); return null; } // read variable from the last recognized pattern result = pattern.GetVariable(Index); } // standard epilog thread.CurrentNode = Parent; return result; }
protected override object DoEvaluate(ScriptThread thread) { // standard prolog thread.CurrentNode = this; // evaluate expression var expression = Expression.EvaluateExpression(thread); object result = null; // extract last recognized pattern (it contains bound variables) var lastPattern = thread.GetLastPattern(); if (lastPattern == null) { thread.ThrowScriptError("Internal error: last recognized pattern is lost."); return null; // never gets here } // with-clause if (Block != null) { Block.InputExpression = expression; Block.BlockPattern = lastPattern; result = Block.Evaluate(thread); } // where-clause else if (Pattern != null) { result = EvaluateWhereClause(expression, lastPattern, thread); } // internal compiler error else { thread.ThrowScriptError("Internal error: AST node doen't represent neither where- nor when-clause."); return null; // never get here } // standard epilog thread.CurrentNode = Parent; return result; }