private void ReorderParams(int[] paramOrder, object[] vars, VBBinderState state) { int num = Math.Max(vars.GetUpperBound(0), paramOrder.GetUpperBound(0)); state.m_OriginalParamOrder = new int[num + 1]; int num3 = num; for (int i = 0; i <= num3; i++) { state.m_OriginalParamOrder[i] = paramOrder[i]; } }
public override MethodBase BindToMethod(BindingFlags bindingAttr, MethodBase[] match, ref object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] names, ref object ObjState) { int num; int[] numArray; Type type = null; bool flag; int num3; ParameterInfo info; int num4; int num5; Type elementType = null; int num8; ParameterInfo[] infoArray; int num9; Type parameterType = null; int num11; MethodBase base4; if ((match == null) || (match.Length == 0)) { throw ExceptionUtils.VbMakeException(0x1b6); } if (((this.m_CachedMember != null) && (this.m_CachedMember.MemberType == MemberTypes.Method)) && ((match[0] != null) && (match[0].Name == this.m_CachedMember.Name))) { return (MethodBase) this.m_CachedMember; } bool isPropertySet = (bindingAttr & BindingFlags.SetProperty) != BindingFlags.Default; if ((names != null) && (names.Length == 0)) { names = null; } int length = match.Length; if (length > 1) { int num25 = match.GetUpperBound(0); for (num5 = 0; num5 <= num25; num5++) { base4 = match[num5]; if ((base4 != null) && !base4.IsHideBySig) { if (base4.IsVirtual) { if ((base4.Attributes & MethodAttributes.NewSlot) != MethodAttributes.PrivateScope) { int num26 = match.GetUpperBound(0); for (int i = 0; i <= num26; i++) { if (((num5 != i) && (match[i] != null)) && base4.DeclaringType.IsSubclassOf(match[i].DeclaringType)) { match[i] = null; length--; } } } } else { int num27 = match.GetUpperBound(0); for (int j = 0; j <= num27; j++) { if (((num5 != j) && (match[j] != null)) && base4.DeclaringType.IsSubclassOf(match[j].DeclaringType)) { match[j] = null; length--; } } } } } } int num2 = length; if (names != null) { int num28 = match.GetUpperBound(0); for (num5 = 0; num5 <= num28; num5++) { base4 = match[num5]; if (base4 != null) { infoArray = base4.GetParameters(); num4 = infoArray.GetUpperBound(0); if (isPropertySet) { num4--; } if (num4 >= 0) { info = infoArray[num4]; num8 = -1; if (info.ParameterType.IsArray) { object[] customAttributes = info.GetCustomAttributes(typeof(ParamArrayAttribute), false); if ((customAttributes != null) && (customAttributes.Length > 0)) { num8 = num4; } else { num8 = -1; } } } int num29 = names.GetUpperBound(0); for (int k = 0; k <= num29; k++) { int num30 = num4; num9 = 0; while (num9 <= num30) { if (Strings.StrComp(names[k], infoArray[num9].Name, CompareMethod.Text) == 0) { if ((num9 == num8) && (length == 1)) { throw ExceptionUtils.VbMakeExceptionEx(0x1be, Utils.GetResourceString("NamedArgumentOnParamArray")); } if (num9 == num8) { num9 = num4 + 1; } break; } num9++; } if (num9 > num4) { if (length == 1) { throw new MissingMemberException(Utils.GetResourceString("Argument_InvalidNamedArg2", new string[] { names[k], this.CalledMethodName() })); } match[num5] = null; length--; break; } } } } } int[] numArray2 = new int[(match.Length - 1) + 1]; int upperBound = match.GetUpperBound(0); for (num5 = 0; num5 <= upperBound; num5++) { base4 = match[num5]; if (base4 != null) { num8 = -1; infoArray = base4.GetParameters(); num4 = infoArray.GetUpperBound(0); if (isPropertySet) { num4--; } if (num4 >= 0) { info = infoArray[num4]; if (info.ParameterType.IsArray) { object[] objArray3 = info.GetCustomAttributes(typeof(ParamArrayAttribute), false); if ((objArray3 != null) && (objArray3.Length > 0)) { num8 = num4; } } } numArray2[num5] = num8; if ((num8 == -1) && (args.Length > infoArray.Length)) { if (length == 1) { throw new MissingMemberException(Utils.GetResourceString("NoMethodTakingXArguments2", new string[] { this.CalledMethodName(), Conversions.ToString(this.GetPropArgCount(args, isPropertySet)) })); } match[num5] = null; length--; } int num14 = num4; if (num8 != -1) { num14--; } if (args.Length < num14) { int num32 = num14 - 1; int index = args.Length; while (index <= num32) { if (infoArray[index].DefaultValue == DBNull.Value) { break; } index++; } if (index != num14) { if (length == 1) { throw new MissingMemberException(Utils.GetResourceString("NoMethodTakingXArguments2", new string[] { this.CalledMethodName(), Conversions.ToString(this.GetPropArgCount(args, isPropertySet)) })); } match[num5] = null; length--; } } } } object[] paramOrder = new object[(match.Length - 1) + 1]; int num33 = match.GetUpperBound(0); for (num5 = 0; num5 <= num33; num5++) { base4 = match[num5]; if (base4 != null) { infoArray = base4.GetParameters(); if (args.Length > infoArray.Length) { numArray = new int[(args.Length - 1) + 1]; } else { numArray = new int[(infoArray.Length - 1) + 1]; } paramOrder[num5] = numArray; if (names == null) { int num16 = args.GetUpperBound(0); if (isPropertySet) { num16--; } int num34 = num16; num = 0; while (num <= num34) { if ((args[num] is Missing) && ((num > infoArray.GetUpperBound(0)) || infoArray[num].IsOptional)) { numArray[num] = -1; } else { numArray[num] = num; } num++; } num16 = numArray.GetUpperBound(0); int num35 = num16; for (num = num; num <= num35; num++) { numArray[num] = -1; } if (isPropertySet) { numArray[num16] = args.GetUpperBound(0); } } else { Exception exception = this.CreateParamOrder(isPropertySet, numArray, base4.GetParameters(), args, names); if (exception != null) { if (length == 1) { throw exception; } match[num5] = null; length--; } } } } Type[] argTypes = new Type[(args.Length - 1) + 1]; int num36 = args.GetUpperBound(0); num = 0; while (num <= num36) { if (args[num] != null) { argTypes[num] = args[num].GetType(); } num++; } int num37 = match.GetUpperBound(0); for (num5 = 0; num5 <= num37; num5++) { base4 = match[num5]; if (base4 != null) { infoArray = base4.GetParameters(); numArray = (int[]) paramOrder[num5]; num4 = numArray.GetUpperBound(0); if (isPropertySet) { num4--; } num8 = numArray2[num5]; if (num8 != -1) { elementType = infoArray[num8].ParameterType.GetElementType(); } else if (numArray.Length > infoArray.Length) { goto Label_08D3; } int num38 = num4; num9 = 0; while (num9 <= num38) { TypeCode empty; num = numArray[num9]; if (num == -1) { if (!infoArray[num9].IsOptional && (num9 != numArray2[num5])) { if (length == 1) { throw new MissingMemberException(Utils.GetResourceString("NoMethodTakingXArguments2", new string[] { this.CalledMethodName(), Conversions.ToString(this.GetPropArgCount(args, isPropertySet)) })); } goto Label_08D3; } } else { type = argTypes[num]; if (type != null) { if ((num8 != -1) && (num9 > num8)) { parameterType = infoArray[num8].ParameterType.GetElementType(); } else { parameterType = infoArray[num9].ParameterType; if (parameterType.IsByRef) { parameterType = parameterType.GetElementType(); } if (num9 == num8) { if (parameterType.IsInstanceOfType(args[num]) && (num9 == num4)) { goto Label_08C2; } parameterType = elementType; } } if ((parameterType != type) && ((type != Type.Missing) || !infoArray[num9].IsOptional)) { if (args[num] == Missing.Value) { goto Label_08D3; } if ((parameterType != typeof(object)) && !parameterType.IsInstanceOfType(args[num])) { TypeCode typeCode = Type.GetTypeCode(parameterType); if (type == null) { empty = TypeCode.Empty; } else { empty = Type.GetTypeCode(type); } switch (typeCode) { case TypeCode.Boolean: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.Int32: case TypeCode.Int64: case TypeCode.Single: case TypeCode.Double: case TypeCode.Decimal: switch (empty) { case TypeCode.Boolean: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.Int32: case TypeCode.Int64: case TypeCode.Single: case TypeCode.Double: case TypeCode.Decimal: case TypeCode.String: goto Label_08C2; } goto Label_08D3; case TypeCode.Char: switch (empty) { case TypeCode.String: goto Label_08D3; } goto Label_08C2; case TypeCode.SByte: case TypeCode.UInt16: case TypeCode.UInt32: case TypeCode.UInt64: case (TypeCode.DateTime | TypeCode.Object): goto Label_0896; case TypeCode.DateTime: switch (empty) { case TypeCode.String: goto Label_08D3; } goto Label_08C2; case TypeCode.String: switch (empty) { case TypeCode.Empty: case TypeCode.Boolean: case TypeCode.Char: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.Int32: case TypeCode.Int64: case TypeCode.Single: case TypeCode.Double: case TypeCode.Decimal: case TypeCode.String: goto Label_08C2; } break; default: goto Label_0896; } if (type != typeof(char[])) { goto Label_08D3; } } } } } goto Label_08C2; Label_0896: if (parameterType != typeof(char[])) { goto Label_08D3; } TypeCode code10 = empty; if ((code10 != TypeCode.String) && ((code10 != TypeCode.Object) || (type != typeof(char[])))) { goto Label_08D3; } Label_08C2: num9++; } } continue; Label_08D3: if (length == 1) { if (num2 != 1) { throw new AmbiguousMatchException(Utils.GetResourceString("AmbiguousMatch_NarrowingConversion1", new string[] { this.CalledMethodName() })); } this.ThrowInvalidCast(type, parameterType, num9); } match[num5] = null; length--; } length = 0; int num39 = match.GetUpperBound(0); for (num5 = 0; num5 <= num39; num5++) { base4 = match[num5]; if (base4 != null) { numArray = (int[]) paramOrder[num5]; infoArray = base4.GetParameters(); bool flag3 = false; num4 = infoArray.GetUpperBound(0); if (isPropertySet) { num4--; } num3 = args.GetUpperBound(0); if (isPropertySet) { num3--; } num8 = numArray2[num5]; if (num8 != -1) { elementType = infoArray[num4].ParameterType.GetElementType(); } int num40 = num4; num9 = 0; while (num9 <= num40) { if (num9 == num8) { parameterType = elementType; } else { parameterType = infoArray[num9].ParameterType; } if (parameterType.IsByRef) { flag3 = true; parameterType = parameterType.GetElementType(); } num = numArray[num9]; if (((num != -1) || !infoArray[num9].IsOptional) && (num9 != numArray2[num5])) { type = argTypes[num]; if (((type != null) && ((type != Type.Missing) || !infoArray[num9].IsOptional)) && ((parameterType != type) && (parameterType != typeof(object)))) { TypeCode code3; TypeCode code4 = Type.GetTypeCode(parameterType); if (type == null) { code3 = TypeCode.Empty; } else { code3 = Type.GetTypeCode(type); } switch (code4) { case TypeCode.Boolean: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.Int32: case TypeCode.Int64: case TypeCode.Single: case TypeCode.Double: case TypeCode.Decimal: switch (code3) { case TypeCode.Boolean: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.Int32: case TypeCode.Int64: case TypeCode.Single: case TypeCode.Double: case TypeCode.Decimal: case TypeCode.String: goto Label_0B0F; } goto Label_0AF9; } } } goto Label_0B0F; Label_0AF9: if (length == 0) { this.ThrowInvalidCast(type, parameterType, num9); } Label_0B0F: num9++; } if (num9 > num4) { if (num5 != length) { match[length] = match[num5]; paramOrder[length] = paramOrder[num5]; numArray2[length] = numArray2[num5]; match[num5] = null; } length++; if (flag3) { flag = true; } } else { match[num5] = null; } } } if (length == 0) { throw new MissingMemberException(Utils.GetResourceString("NoMethodTakingXArguments2", new string[] { this.CalledMethodName(), Conversions.ToString(this.GetPropArgCount(args, isPropertySet)) })); } VBBinderState state = new VBBinderState(); this.m_state = state; ObjState = state; state.m_OriginalArgs = args; if (length == 1) { num11 = 0; } else { num11 = 0; BindScore unknown = BindScore.Unknown; int num17 = 0; int num41 = length - 1; for (num5 = 0; num5 <= num41; num5++) { base4 = match[num5]; if (base4 != null) { numArray = (int[]) paramOrder[num5]; BindScore score2 = this.BindingScore(base4.GetParameters(), numArray, argTypes, isPropertySet, numArray2[num5]); if (score2 < unknown) { if (num5 != 0) { match[0] = match[num5]; paramOrder[0] = paramOrder[num5]; numArray2[0] = numArray2[num5]; match[num5] = null; } num17 = 1; unknown = score2; continue; } if (score2 == unknown) { if ((score2 == BindScore.Exact) || (score2 == BindScore.Widening1)) { bool flag4; switch (this.GetMostSpecific(match[0], base4, numArray, paramOrder, isPropertySet, numArray2[0], numArray2[num5], args)) { case -1: { if (num17 != num5) { match[num17] = match[num5]; paramOrder[num17] = paramOrder[num5]; numArray2[num17] = numArray2[num5]; match[num5] = null; } num17++; continue; } case 0: { continue; } default: { flag4 = true; int num42 = num17 - 1; for (int m = 1; m <= num42; m++) { if (this.GetMostSpecific(match[m], base4, numArray, paramOrder, isPropertySet, numArray2[m], numArray2[num5], args) != 1) { flag4 = false; break; } } break; } } if (flag4) { num17 = 0; } if (num5 != num17) { match[num17] = match[num5]; paramOrder[num17] = paramOrder[num5]; numArray2[num17] = numArray2[num5]; match[num5] = null; } num17++; continue; } if (num17 != num5) { match[num17] = match[num5]; paramOrder[num17] = paramOrder[num5]; numArray2[num17] = numArray2[num5]; match[num5] = null; } num17++; continue; } match[num5] = null; } } if (num17 > 1) { int num43 = match.GetUpperBound(0); for (num5 = 0; num5 <= num43; num5++) { base4 = match[num5]; if (base4 != null) { int num44 = match.GetUpperBound(0); for (int n = 0; n <= num44; n++) { if (((num5 != n) && (match[n] != null)) && ((base4 == match[n]) || (base4.DeclaringType.IsSubclassOf(match[n].DeclaringType) && this.MethodsDifferOnlyByReturnType(base4, match[n])))) { match[n] = null; num17--; } } } } int num45 = match.GetUpperBound(0); for (num5 = 0; num5 <= num45; num5++) { if (match[num5] == null) { int num46 = match.GetUpperBound(0); for (int num20 = num5 + 1; num20 <= num46; num20++) { MethodBase base5 = match[num20]; if (base5 != null) { match[num5] = base5; paramOrder[num5] = paramOrder[num20]; numArray2[num5] = numArray2[num20]; match[num20] = null; } } } } } if (num17 > 1) { string str = "\r\n " + Utils.MethodToString(match[0]); int num47 = num17 - 1; for (num5 = 1; num5 <= num47; num5++) { str = str + "\r\n " + Utils.MethodToString(match[num5]); } switch (unknown) { case BindScore.Exact: throw new AmbiguousMatchException(Utils.GetResourceString("AmbiguousCall_ExactMatch2", new string[] { this.CalledMethodName(), str })); case BindScore.Widening0: case BindScore.Widening1: throw new AmbiguousMatchException(Utils.GetResourceString("AmbiguousCall_WideningConversion2", new string[] { this.CalledMethodName(), str })); } throw new AmbiguousMatchException(Utils.GetResourceString("AmbiguousCall2", new string[] { this.CalledMethodName(), str })); } } MethodBase base3 = match[num11]; numArray = (int[]) paramOrder[num11]; if (names != null) { this.ReorderParams(numArray, args, state); } ParameterInfo[] parameters = base3.GetParameters(); if (args.Length > 0) { state.m_ByRefFlags = new bool[args.GetUpperBound(0) + 1]; flag = false; int num48 = parameters.GetUpperBound(0); for (num9 = 0; num9 <= num48; num9++) { if (parameters[num9].ParameterType.IsByRef) { if (state.m_OriginalParamOrder == null) { if (num9 < state.m_ByRefFlags.Length) { state.m_ByRefFlags[num9] = true; } } else if (num9 < state.m_OriginalParamOrder.Length) { int num21 = state.m_OriginalParamOrder[num9]; if (num21 >= 0) { state.m_ByRefFlags[num21] = true; } } flag = true; } } if (!flag) { state.m_ByRefFlags = null; } } else { state.m_ByRefFlags = null; } num8 = numArray2[num11]; if (num8 != -1) { num4 = parameters.GetUpperBound(0); if (isPropertySet) { num4--; } num3 = args.GetUpperBound(0); if (isPropertySet) { num3--; } object[] objArray4 = new object[(parameters.Length - 1) + 1]; int num49 = Math.Min(num3, num8) - 1; for (num9 = 0; num9 <= num49; num9++) { objArray4[num9] = ObjectType.CTypeHelper(args[num9], parameters[num9].ParameterType); } if (num3 < num8) { int num50 = num8 - 1; for (num9 = num3 + 1; num9 <= num50; num9++) { objArray4[num9] = ObjectType.CTypeHelper(parameters[num9].DefaultValue, parameters[num9].ParameterType); } } if (isPropertySet) { int num22 = objArray4.GetUpperBound(0); objArray4[num22] = ObjectType.CTypeHelper(args[args.GetUpperBound(0)], parameters[num22].ParameterType); } if (num3 == -1) { objArray4[num8] = Array.CreateInstance(elementType, 0); } else { elementType = parameters[num4].ParameterType.GetElementType(); int num23 = (args.Length - parameters.Length) + 1; parameterType = parameters[num4].ParameterType; if (((num23 == 1) && parameterType.IsArray) && ((args[num8] == null) || parameterType.IsInstanceOfType(args[num8]))) { objArray4[num8] = args[num8]; } else if (elementType == typeof(object)) { object[] objArray5 = new object[(num23 - 1) + 1]; int num51 = num23 - 1; for (num = 0; num <= num51; num++) { objArray5[num] = ObjectType.CTypeHelper(args[num + num8], elementType); } objArray4[num8] = objArray5; } else { Array array = Array.CreateInstance(elementType, num23); int num52 = num23 - 1; for (num = 0; num <= num52; num++) { array.SetValue(ObjectType.CTypeHelper(args[num + num8], elementType), num); } objArray4[num8] = array; } } args = objArray4; } else { object[] objArray6 = new object[(parameters.Length - 1) + 1]; int num53 = objArray6.GetUpperBound(0); num = 0; while (num <= num53) { int num24 = numArray[num]; if ((num24 >= 0) && (num24 <= args.GetUpperBound(0))) { objArray6[num] = ObjectType.CTypeHelper(args[num24], parameters[num].ParameterType); } else { objArray6[num] = ObjectType.CTypeHelper(parameters[num].DefaultValue, parameters[num].ParameterType); } num++; } int num54 = parameters.GetUpperBound(0); for (num9 = num; num9 <= num54; num9++) { objArray6[num9] = ObjectType.CTypeHelper(parameters[num9].DefaultValue, parameters[num9].ParameterType); } args = objArray6; } if (base3 == null) { throw new MissingMemberException(Utils.GetResourceString("NoMethodTakingXArguments2", new string[] { this.CalledMethodName(), Conversions.ToString(this.GetPropArgCount(args, isPropertySet)) })); } return base3; }