Example #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 = NumberVMUtils.ParseBoolean(text, out error);
					if (!string.IsNullOrEmpty(error))
						return error;
					bytes = BitConverter.GetBytes(value);
					return null;
				}

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

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

			case CorElementType.R8:
				{
					var value = NumberVMUtils.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 = NumberVMUtils.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";
		}
Example #2
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");
        }
Example #3
0
 public CorElementType TryGetPrimitiveType() => debugger.Dispatcher.UI(() => (CorElementType)type.TryGetPrimitiveType());