Example #1
0
		string GetEnumValue(CorType type, out byte[] bytes) {
			bytes = null;
			Debug.Assert(type != null && type.IsEnum);

			if (text == string.Empty)
				return dnSpy_Debugger_Resources.LocalsEditValue_Error_EnterSomeText;

			var etype = type.EnumUnderlyingType;
			if (etype == CorElementType.End)
				return "Internal error: type is not an enum";

			var consts = text.Split('|').Select(a => a.Trim()).ToArray();

			bool isFlagsAttr = type.HasAttribute("System.FlagsAttribute");
			var fields = type.GetFields(false).Where(a => a.Constant != null && (a.Attributes & (FieldAttributes.Literal | FieldAttributes.Static)) == (FieldAttributes.Literal | FieldAttributes.Static));
			bool isInteger = !(etype == CorElementType.R4 || etype == CorElementType.R8);
			if (isFlagsAttr && isInteger) {
				var dict = new Dictionary<string, object>();
				foreach (var f in fields) {
					if (!dict.ContainsKey(f.Name))
						dict[f.Name] = f.Constant;
				}
				ulong value = 0;
				foreach (var c in consts) {
					ulong? newv;
					object o;
					string error;
					if (dict.TryGetValue(c, out o))
						newv = IntegerToUInt64ZeroExtend(o);
					else
						newv = ParseIntegerConstant(etype, c, out error);
					if (newv == null)
						return string.Format(dnSpy_Debugger_Resources.LocalsEditValue_Error_UnknownEnumValue, c);
					value |= newv.Value;
				}

				bytes = Convert(etype, ConvertUInt64(etype, value));
				if (bytes != null)
					return null;
			}
			else {
				if (consts.Length != 1)
					return dnSpy_Debugger_Resources.LocalsEditValue_Error_InvalidEnumValue;

				var c = consts[0];
				foreach (var field in fields) {
					if (field.Name == c) {
						bytes = Convert(etype, field.Constant);
						if (bytes != null)
							return null;
					}
				}

				if (isInteger) {
					string error;
					var newv = ParseIntegerConstant(etype, c, out error);
					if (newv != null) {
						bytes = Convert(etype, ConvertUInt64(etype, newv.Value));
						if (bytes != null)
							return null;
					}
				}
				else {
					if (etype == CorElementType.R4) {
						float v;
						if (float.TryParse(c, out v)) {
							bytes = BitConverter.GetBytes(v);
							return null;
						}
					}
					else {
						Debug.Assert(etype == CorElementType.R8);
						double v;
						if (double.TryParse(c, out v)) {
							bytes = BitConverter.GetBytes(v);
							return null;
						}
					}
				}
			}

			return dnSpy_Debugger_Resources.LocalsEditValue_Error_InvalidEnumValue;
		}
Example #2
0
        string GetEnumValue(CorType type, out byte[] bytes)
        {
            bytes = null;
            Debug.Assert(type != null && type.IsEnum);

            if (text == string.Empty)
            {
                return(dnSpy_Debugger_Resources.LocalsEditValue_Error_EnterSomeText);
            }

            var etype = type.EnumUnderlyingType;

            if (etype == CorElementType.End)
            {
                return("Internal error: type is not an enum");
            }

            var consts = text.Split('|').Select(a => a.Trim()).ToArray();

            bool isFlagsAttr = type.HasAttribute("System.FlagsAttribute");
            var  fields      = type.GetFields(false).Where(a => a.Constant != null && (a.Attributes & (FieldAttributes.Literal | FieldAttributes.Static)) == (FieldAttributes.Literal | FieldAttributes.Static));
            bool isInteger   = !(etype == CorElementType.R4 || etype == CorElementType.R8);

            if (isFlagsAttr && isInteger)
            {
                var dict = new Dictionary <string, object>();
                foreach (var f in fields)
                {
                    if (!dict.ContainsKey(f.Name))
                    {
                        dict[f.Name] = f.Constant;
                    }
                }
                ulong value = 0;
                foreach (var c in consts)
                {
                    ulong? newv;
                    object o;
                    string error;
                    if (dict.TryGetValue(c, out o))
                    {
                        newv = IntegerToUInt64ZeroExtend(o);
                    }
                    else
                    {
                        newv = ParseIntegerConstant(etype, c, out error);
                    }
                    if (newv == null)
                    {
                        return(string.Format(dnSpy_Debugger_Resources.LocalsEditValue_Error_UnknownEnumValue, c));
                    }
                    value |= newv.Value;
                }

                bytes = Convert(etype, ConvertUInt64(etype, value));
                if (bytes != null)
                {
                    return(null);
                }
            }
            else
            {
                if (consts.Length != 1)
                {
                    return(dnSpy_Debugger_Resources.LocalsEditValue_Error_InvalidEnumValue);
                }

                var c = consts[0];
                foreach (var field in fields)
                {
                    if (field.Name == c)
                    {
                        bytes = Convert(etype, field.Constant);
                        if (bytes != null)
                        {
                            return(null);
                        }
                    }
                }

                if (isInteger)
                {
                    string error;
                    var    newv = ParseIntegerConstant(etype, c, out error);
                    if (newv != null)
                    {
                        bytes = Convert(etype, ConvertUInt64(etype, newv.Value));
                        if (bytes != null)
                        {
                            return(null);
                        }
                    }
                }
                else
                {
                    if (etype == CorElementType.R4)
                    {
                        float v;
                        if (float.TryParse(c, out v))
                        {
                            bytes = BitConverter.GetBytes(v);
                            return(null);
                        }
                    }
                    else
                    {
                        Debug.Assert(etype == CorElementType.R8);
                        double v;
                        if (double.TryParse(c, out v))
                        {
                            bytes = BitConverter.GetBytes(v);
                            return(null);
                        }
                    }
                }
            }

            return(dnSpy_Debugger_Resources.LocalsEditValue_Error_InvalidEnumValue);
        }
Example #3
0
 public bool HasAttribute(string attributeName) => debugger.Dispatcher.UI(() => type.HasAttribute(attributeName));