Browse Source

mono-api-info: avoid NumberOverflow

GetFlaggedEnumValue converts values to Int64 which
can cause a NumberOverflow exception when the value
is too large to fit (e.g. a large UInt64). Special
case UInt64 values for now (duplicates the logic,
which sucks).
Aaron Bockover 12 years ago
parent
commit
bc6da57cc1
1 changed files with 30 additions and 0 deletions
  1. 30 0
      mcs/tools/corcompare/mono-api-info.cs

+ 30 - 0
mcs/tools/corcompare/mono-api-info.cs

@@ -1231,6 +1231,9 @@ namespace CorCompare
 
 		static object GetFlaggedEnumValue (TypeDefinition type, object value)
 		{
+			if (value is ulong)
+				return GetFlaggedEnumValue (type, (ulong)value);
+
 			long flags = Convert.ToInt64 (value);
 			var signature = new StringBuilder ();
 
@@ -1257,6 +1260,33 @@ namespace CorCompare
 			return signature.ToString ();
 		}
 
+		static object GetFlaggedEnumValue (TypeDefinition type, ulong flags)
+		{
+			var signature = new StringBuilder ();
+
+			for (int i = type.Fields.Count - 1; i >= 0; i--) {
+				FieldDefinition field = type.Fields [i];
+
+				if (!field.HasConstant)
+					continue;
+
+				ulong flag = Convert.ToUInt64 (field.Constant);
+
+				if (flag == 0)
+					continue;
+
+				if ((flags & flag) == flag) {
+					if (signature.Length != 0)
+						signature.Append (", ");
+
+					signature.Append (field.Name);
+					flags -= flag;
+				}
+			}
+
+			return signature.ToString ();
+		}
+
 		static object GetEnumValue (TypeDefinition type, object value)
 		{
 			foreach (FieldDefinition field in type.Fields) {