private object ResolveArgumentValue(MetadataCAArgumentStruct* argument, Type type)
{
TypeCode typeCode = (TypeCode)(argument->ArgumentType->Attributes >> 24);
var valuePtr = MetadataCAArgumentStruct.GetArgumentAddress(argument);
// If its an enum type
if (argument->ArgumentType->ParentType == EnumTypePtr)
{
typeCode = (TypeCode)(argument->ArgumentType->ElementType->Attributes >> 24);
}
switch (typeCode)
{
// 1 byte
case TypeCode.Boolean:
return ((bool*)valuePtr)[0];
case TypeCode.U1:
return ((byte*)valuePtr)[0];
case TypeCode.I1:
return ((sbyte*)valuePtr)[0];
// 2 bytes
case TypeCode.Char:
return ((char*)valuePtr)[0];
case TypeCode.U2:
return ((ushort*)valuePtr)[0];
case TypeCode.I2:
return ((short*)valuePtr)[0];
// 4 bytes
case TypeCode.U4:
return valuePtr[0];
case TypeCode.I4:
return ((int*)valuePtr)[0];
case TypeCode.R4:
return ((float*)valuePtr)[0];
// 8 bytes
case TypeCode.U8:
return ((ulong*)valuePtr)[0];
case TypeCode.I8:
return ((long*)valuePtr)[0];
case TypeCode.R8:
return ((double*)valuePtr)[0];
// SZArray
case TypeCode.SZArray:
return ResolveArrayValue(argument, type);
// String
case TypeCode.String:
return Mosa.Runtime.Internal.InitializeMetadataString(valuePtr);
default:
if (type.FullName == "System.Type")
{
// Get the argument type
RuntimeTypeHandle argTypeHandle = new RuntimeTypeHandle();
((uint**)&argTypeHandle)[0] = (uint*)argument->ArgumentType;
return Type.GetTypeFromHandle(argTypeHandle);
}
throw new ArgumentException();
}
//return null;
}