예제 #1
0
        public string GetPrimitiveValue(CorType type, out byte[] bytes)
        {
            bytes = null;
            if (type == null)
            {
                return("Internal error: CorType is null");
            }

            if (type.IsEnum)
            {
                return(GetEnumValue(type, out bytes));
            }

            string error;
            var    etype = type.TryGetPrimitiveType();

            switch (etype)
            {
            case CorElementType.Boolean:
            {
                var value = SimpleTypeConverter.ParseBoolean(text, out error);
                if (!string.IsNullOrEmpty(error))
                {
                    return(error);
                }
                bytes = BitConverter.GetBytes(value);
                return(null);
            }

            case CorElementType.Char:
            {
                var value = SimpleTypeConverter.ParseChar(text, out error);
                if (!string.IsNullOrEmpty(error))
                {
                    return(error);
                }
                bytes = BitConverter.GetBytes(value);
                return(null);
            }

            case CorElementType.R4:
            {
                var value = SimpleTypeConverter.ParseSingle(text, out error);
                if (!string.IsNullOrEmpty(error))
                {
                    return(error);
                }
                bytes = BitConverter.GetBytes(value);
                return(null);
            }

            case CorElementType.R8:
            {
                var value = SimpleTypeConverter.ParseDouble(text, out error);
                if (!string.IsNullOrEmpty(error))
                {
                    return(error);
                }
                bytes = BitConverter.GetBytes(value);
                return(null);
            }

            case CorElementType.Class:
            case CorElementType.ValueType:
                if (type.IsSystemDecimal)
                {
                    var value = SimpleTypeConverter.ParseDecimal(text, out error);
                    if (!string.IsNullOrEmpty(error))
                    {
                        return(error);
                    }
                    bytes = GetBytes(value);
                    return(null);
                }
                return(null);

            case CorElementType.I:
            case CorElementType.U:
            case CorElementType.Ptr:
            case CorElementType.FnPtr:
                if (text.Trim() == "null")
                {
                    bytes = new byte[IntPtr.Size];
                    return(null);
                }
                break;
            }

            ulong?res = ParseIntegerConstant(etype, text, out error);

            if (res == null)
            {
                return(error ?? dnSpy_Debugger_Resources.LocalsEditValue_Error_InvalidNumber);
            }

            switch (etype)
            {
            case CorElementType.I1:
                bytes = new byte[1] {
                    (byte)res.Value
                };
                return(null);

            case CorElementType.U1:
                bytes = new byte[1] {
                    (byte)res.Value
                };
                return(null);

            case CorElementType.I2:
                bytes = BitConverter.GetBytes((short)res.Value);
                return(null);

            case CorElementType.U2:
                bytes = BitConverter.GetBytes((ushort)res.Value);
                return(null);

            case CorElementType.I4:
                bytes = BitConverter.GetBytes((int)res.Value);
                return(null);

            case CorElementType.U4:
                bytes = BitConverter.GetBytes((uint)res.Value);
                return(null);

            case CorElementType.I8:
                bytes = BitConverter.GetBytes((long)res.Value);
                return(null);

            case CorElementType.U8:
                bytes = BitConverter.GetBytes(res.Value);
                return(null);

            case CorElementType.I:
            case CorElementType.U:
            case CorElementType.Ptr:
            case CorElementType.FnPtr:
                if (IntPtr.Size == 4)
                {
                    goto case CorElementType.I4;
                }
                goto case CorElementType.I8;
            }

            return("Unknown number type");
        }