in ClrMemDiag/Desktop/heap.cs [546:687]
internal object GetValueAtAddress(ClrElementType cet, Address addr)
{
switch (cet)
{
case ClrElementType.String:
return GetStringContents(addr);
case ClrElementType.Class:
case ClrElementType.Array:
case ClrElementType.SZArray:
case ClrElementType.Object:
{
Address val;
if (!MemoryReader.TryReadPtr(addr, out val))
return null;
return val;
}
case ClrElementType.Boolean:
{
byte val;
if (!DesktopRuntime.ReadByte(addr, out val))
return null;
return val != 0;
}
case ClrElementType.Int32:
{
int val;
if (!DesktopRuntime.ReadDword(addr, out val))
return null;
return val;
}
case ClrElementType.UInt32:
{
uint val;
if (!DesktopRuntime.ReadDword(addr, out val))
return null;
return val;
}
case ClrElementType.Int64:
{
long val;
if (!DesktopRuntime.ReadQword(addr, out val))
return long.MaxValue;
return val;
}
case ClrElementType.UInt64:
{
ulong val;
if (!DesktopRuntime.ReadQword(addr, out val))
return long.MaxValue;
return val;
}
case ClrElementType.NativeUInt: // native unsigned int
case ClrElementType.Pointer:
case ClrElementType.FunctionPointer:
{
ulong val;
if (!MemoryReader.TryReadPtr(addr, out val))
return null;
return val;
}
case ClrElementType.NativeInt: // native int
{
ulong val;
if (!MemoryReader.TryReadPtr(addr, out val))
return null;
return (long)val;
}
case ClrElementType.Int8:
{
sbyte val;
if (!DesktopRuntime.ReadByte(addr, out val))
return null;
return val;
}
case ClrElementType.UInt8:
{
byte val;
if (!DesktopRuntime.ReadByte(addr, out val))
return null;
return val;
}
case ClrElementType.Float:
{
float val;
if (!DesktopRuntime.ReadFloat(addr, out val))
return null;
return val;
}
case ClrElementType.Double: // double
{
double val;
if (!DesktopRuntime.ReadFloat(addr, out val))
return null;
return val;
}
case ClrElementType.Int16:
{
short val;
if (!DesktopRuntime.ReadShort(addr, out val))
return null;
return val;
}
case ClrElementType.Char: // u2
{
ushort val;
if (!DesktopRuntime.ReadShort(addr, out val))
return null;
return (char)val;
}
case ClrElementType.UInt16:
{
ushort val;
if (!DesktopRuntime.ReadShort(addr, out val))
return null;
return val;
}
}
throw new Exception("Unexpected element type.");
}