public void SetRawExpression(string rawExpr, int len) { ExprsStrings = new string[len]; if (Exprs != null) { for (var i = 0; i < Exprs.Length; ++i) { Exprs[i]?.Dealloc(); } } Exprs = new ScalarExpression[len]; _values = new Value[len]; for (var i = 0; i < ExprsStrings.Length; ++i) { ExprsStrings[i] = rawExpr; } ExprString = ExprsStrings[0]; CachedValue.SwitchTo(new Value(_values)); Recalculate(); }
public override void Recalculate(int depth = 1) { if (depth > MaxRecursionDepth) { // we are proabaly about to encounter a stack overflow return; } // remove all the DependentOn values // e.g. remove the cross-references foreach (var e in DependentOn) { e.UsedBy.Remove(this); } DependentOn.Clear(); try { var val = Evaluater.Evaluate(ExprString, VarEval, IndexInArray); CachedValue.SwitchTo(val.IsArray ? val.AsArray[IndexInArray] : val); } catch { StepManager.ErrorOccurred = true; } if (!IsWeak) { if (UsedBy.Count > 0) { var copyOfUsedBy = new List <Expression>(UsedBy); UsedBy.Clear(); foreach (var e in copyOfUsedBy) { e.Recalculate(depth + 1); } } ParentArray?.NotifyElementChanged(); } ValueChanged?.Invoke(this, EventArgs.Empty); }