private bool EvaluateFunctionArgument(CalcExpression argExpr, CalcEvaluatorContext context, bool acceptsArray, bool acceptsReference, bool acceptsError, bool acceptsMissingArgument, out object result) { if (((context != null) && (acceptsArray || context.ExpandArrayToMultiCall)) && !context.ArrayFormulaMode) { using (context.EnterExpandArrayToMultiCallMode()) { return(this.EvaluateFunctionArgumentImp(argExpr, context, false, acceptsReference, acceptsError, acceptsMissingArgument, out result)); } } return(this.EvaluateFunctionArgumentImp(argExpr, context, acceptsArray, acceptsReference, acceptsError, acceptsMissingArgument, out result)); }
private object EvaluateFunctionTwoOrMoreArgs(CalcFunction func, object[] args, CalcEvaluatorContext context, bool acceptsArray, bool acceptsReference) { int length = args.Length; bool[] flagArray = new bool[length]; bool flag = true; for (int i = 0; i < length; i++) { object obj2 = null; bool flag2 = func.AcceptsReference(i); bool flag3 = flag2 || CalcHelper.TryExtractToSingleValue(args[i], out obj2); flag = flag && flag3; flagArray[i] = flag3; if (!flag2) { args[i] = obj2; } } if (flag) { return(this.EvaluateFunction(func, args, context, acceptsArray, acceptsReference, 0, 0)); } int[] numArray = new int[length]; int[] numArray2 = new int[length]; for (int j = 0; j < length; j++) { CalcArray array = args[j] as CalcArray; numArray[j] = (flagArray[j] || (array == null)) ? -1 : array.RowCount; numArray2[j] = (flagArray[j] || (array == null)) ? -1 : array.ColumnCount; } int num4 = -1; int num5 = -1; if (!flagArray[0]) { num4 = numArray[0]; num5 = numArray2[0]; } for (int k = 1; k < length; k++) { if (!flagArray[k]) { int num7 = numArray[k]; int num8 = numArray2[k]; num4 = (num4 == -1) ? num7 : ((num7 > 1) ? ((num4 > 1) ? Math.Min(num7, num4) : num7) : num4); num5 = (num5 == -1) ? num8 : ((num8 > 1) ? ((num5 > 1) ? Math.Min(num8, num5) : num8) : num5); } } object[,] values = new object[num4, num5]; using (context.EnterExpandArrayToMultiCallMode()) { for (int m = 0; m < num4; m++) { for (int n = 0; n < num5; n++) { object[] objArray2 = new object[length]; for (int num11 = 0; num11 < length; num11++) { objArray2[num11] = flagArray[num11] ? args[num11] : CalcHelper.GetArrayValue(args[num11] as CalcArray, m, n); } values[m, n] = this.EvaluateFunction(func, objArray2, context, acceptsArray, acceptsReference, m, n); } } return(new ConcreteArray <object>(values)); } }
private object EvaluateFunction(CalcFunctionExpression expr, CalcEvaluatorContext context, bool acceptsArray, bool acceptsReference) { CalcFunction function; object[] objArray; object obj2; List <int> list; if (!this.PrepareFunctionArguments(expr, context, out function, out objArray, out list, out obj2)) { return(obj2); } int argCount = expr.ArgCount; if ((context != null) && context.ArrayFormulaMode) { if (argCount > 0) { return(this.EvaluateFunctionWithArrayFormulaMode(function, objArray, context, acceptsArray, acceptsReference)); } return(this.EvaluateFunction(function, objArray, context, acceptsArray, acceptsReference, 0, 0)); } if (((context != null) && context.ExpandArrayToMultiCall) && (list.Count > 0)) { Dictionary <int, object> dictionary = new Dictionary <int, object>(argCount); bool[] flagArray = new bool[argCount]; bool flag = true; for (int i = 0; i < argCount; i++) { if (list.Contains(i)) { CalcArray array = objArray[i] as CalcArray; if (array == null) { dictionary[i] = null; flagArray[i] = true; } else if (array.Length == 1) { dictionary[i] = array.GetValue(0); flagArray[i] = true; } else { dictionary[i] = array; flag = false; } } else { flagArray[i] = true; } } if (!flag) { int[] numArray = new int[argCount]; int[] numArray2 = new int[argCount]; for (int j = 0; j < argCount; j++) { CalcArray array2 = dictionary.ContainsKey(j) ? (dictionary[j] as CalcArray) : null; numArray[j] = (flagArray[j] || (array2 == null)) ? -1 : array2.RowCount; numArray2[j] = (flagArray[j] || (array2 == null)) ? -1 : array2.ColumnCount; } int num4 = -1; int num5 = -1; if (!flagArray[0]) { num4 = numArray[0]; num5 = numArray2[0]; } for (int k = 1; k < argCount; k++) { if (!flagArray[k]) { int num7 = numArray[k]; int num8 = numArray2[k]; num4 = (num4 == -1) ? num7 : ((num7 > 1) ? ((num4 > 1) ? Math.Min(num7, num4) : num7) : num4); num5 = (num5 == -1) ? num8 : ((num8 > 1) ? ((num5 > 1) ? Math.Min(num8, num5) : num8) : num5); } } object[,] values = new object[num4, num5]; object[] objArray3 = new object[objArray.Length]; objArray.CopyTo(objArray3, 0); using (context.EnterExpandArrayToMultiCallMode()) { for (int m = 0; m < num4; m++) { for (int n = 0; n < num5; n++) { foreach (KeyValuePair <int, object> pair in dictionary) { objArray3[pair.Key] = flagArray[pair.Key] ? pair.Value : CalcHelper.GetArrayValue(pair.Value as CalcArray, m, n); } values[m, n] = this.EvaluateFunction(function, objArray3, context, acceptsArray, acceptsReference, m, n); } } return(new ConcreteArray <object>(values)); } } foreach (KeyValuePair <int, object> pair2 in dictionary) { objArray[pair2.Key] = pair2.Value; } } return(this.EvaluateFunction(function, objArray, context, acceptsArray, acceptsReference, 0, 0)); }