internal object GetValueAtAddress()

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.");
        }