internal static unsafe ParameterInfo[] GetParameters(MethodBase method, MemberInfo member, Signature sig, out ParameterInfo returnParameter, bool fetchReturnParameter)
{
RuntimeMethodHandle methodHandle = method.GetMethodHandle();
returnParameter = null;
int length = sig.Arguments.Length;
ParameterInfo[] infoArray = fetchReturnParameter ? null : new ParameterInfo[length];
int methodDef = methodHandle.GetMethodDef();
int count = 0;
if (!System.Reflection.MetadataToken.IsNullToken(methodDef))
{
MetadataImport metadataImport = methodHandle.GetDeclaringType().GetModuleHandle().GetMetadataImport();
count = metadataImport.EnumParamsCount(methodDef);
int *result = stackalloc int[count];
metadataImport.EnumParams(methodDef, result, count);
for (uint i = 0; i < count; i++)
{
ParameterAttributes attributes;
int num5;
int parameterToken = result[(int)((int *)i)];
metadataImport.GetParamDefProps(parameterToken, out num5, out attributes);
num5--;
if (fetchReturnParameter && (num5 == -1))
{
returnParameter = new ParameterInfo(sig, metadataImport, parameterToken, num5, attributes, member);
}
else if (!fetchReturnParameter && (num5 >= 0))
{
infoArray[num5] = new ParameterInfo(sig, metadataImport, parameterToken, num5, attributes, member);
}
}
}
if (fetchReturnParameter)
{
if (returnParameter == null)
{
returnParameter = new ParameterInfo(sig, MetadataImport.EmptyImport, 0, -1, ParameterAttributes.None, member);
}
return(infoArray);
}
if (count < (infoArray.Length + 1))
{
for (int j = 0; j < infoArray.Length; j++)
{
if (infoArray[j] == null)
{
infoArray[j] = new ParameterInfo(sig, MetadataImport.EmptyImport, 0, j, ParameterAttributes.None, member);
}
}
}
return(infoArray);
}