private object ResolveArrayValue(MetadataCAArgumentStruct* argument, Type type)
{
TypeCode typeCode = (TypeCode)(argument->ArgumentType->ElementType->Attributes >> 24);
var valuePtr = MetadataCAArgumentStruct.GetArgumentAddress(argument);
var size = valuePtr[0];
valuePtr++;
switch (typeCode)
{
// 1 byte
case TypeCode.Boolean:
{
bool[] array = new bool[size];
for (int i = 0; i < size; i++)
array[i] = ((bool*)valuePtr)[i];
return array;
}
case TypeCode.U1:
{
byte[] array = new byte[size];
for (int i = 0; i < size; i++)
array[i] = ((byte*)valuePtr)[i];
return array;
}
case TypeCode.I1:
{
sbyte[] array = new sbyte[size];
for (int i = 0; i < size; i++)
array[i] = ((sbyte*)valuePtr)[i];
return array;
}
// 2 bytes
case TypeCode.Char:
{
char[] array = new char[size];
for (int i = 0; i < size; i++)
array[i] = ((char*)valuePtr)[i];
return array;
}
case TypeCode.U2:
{
ushort[] array = new ushort[size];
for (int i = 0; i < size; i++)
array[i] = ((ushort*)valuePtr)[i];
return array;
}
case TypeCode.I2:
{
short[] array = new short[size];
for (int i = 0; i < size; i++)
array[i] = ((short*)valuePtr)[i];
return array;
}
// 4 bytes
case TypeCode.U4:
{
uint[] array = new uint[size];
for (int i = 0; i < size; i++)
array[i] = valuePtr[i];
return array;
}
case TypeCode.I4:
{
int[] array = new int[size];
for (int i = 0; i < size; i++)
array[i] = ((int*)valuePtr)[i];
return array;
}
case TypeCode.R4:
{
float[] array = new float[size];
for (int i = 0; i < size; i++)
array[i] = ((float*)valuePtr)[i];
return array;
}
// 8 bytes
case TypeCode.U8:
{
ulong[] array = new ulong[size];
for (int i = 0; i < size; i++)
array[i] = ((ulong*)valuePtr)[i];
return array;
}
case TypeCode.I8:
{
long[] array = new long[size];
for (int i = 0; i < size; i++)
array[i] = ((long*)valuePtr)[i];
return array;
}
case TypeCode.R8:
{
double[] array = new double[size];
for (int i = 0; i < size; i++)
array[i] = ((double*)valuePtr)[i];
return array;
}
default:
// TODO: Enums
// What kind of array is this!?
throw new NotSupportedException();
}
}