Guys,
I think this fixes bug 25075. At least it works with his test case,
however, I don't wanna check this in immediately since this might break
all type conversion stuff (eek). Could someone look this over and tell
me whether or not this is safe?
BTW, I tried running the NUnit tests on Linux, this is what I get:
<duncan@diphthong: ~/Mono/install/bin/ > mono ./NUnitConsole_mono.exe
MonoTests.AllTests,corlib_linux_test.dll
.........................................
.........................................
...........................E.E.E.E.E.E.E.E.E.E.E.E.E.E.
E.E.E.E.E.E.E.E..F................................
...F.......F.F......F.F.........F..............
......................F...................
............F..........F..............F.....
...............F...................F.......
.........................................
.....Needed to allocate blacklisted block at 0xb6d4000
Needed to allocate blacklisted block at 0xb798000
Needed to allocate blacklisted block at 0xb7f5000
.................E..............F.....
.........................................
..........E.E...F.F.............E.E.E.E.......E...
................E.E.E.E.E.E...............E.E.E.E.E.
E.E.E.E.E.E.F..F.
Time: 16.713
There were 47 errors:
Could not create and run test suite.
<duncan@diphthong: ~/Mono/install/bin/ >
Is this to be expected?
thanks,
Duncan.
Index: Convert.cs
===================================================================
RCS file: /cvs/public/mcs/class/corlib/System/Convert.cs,v
retrieving revision 1.24
diff -u -r1.24 Convert.cs
--- Convert.cs 21 May 2002 20:57:33 -0000 1.24
+++ Convert.cs 21 May 2002 22:19:28 -0000
@@ -2299,24 +2299,24 @@
// type, and uses hardcoded array indexes.
private static Type[] conversionTable = {
// Valid ICovnertible Types
- typeof (Boolean), // 0 TypeCode.Boolean
- typeof (Byte), // 1 TypeCode.Byte
- typeof (Char), // 2 TypeCode.Char
- typeof (DateTime), // 3 TypeCode.DateTime
- typeof (Decimal), // 4 TypeCode.Decimal
- typeof (Double), // 5 TypeCode.Double
- typeof (Int16), // 6 TypeCode.Int16
- typeof (Int32), // 7 TypeCode.Int32
- typeof (Int64), // 8 TypeCode.Int64
- typeof (SByte), // 9 TypeCode.Sbyte
- typeof (Single), // 10 TypeCode.Single
- typeof (String), // 11 TypeCode.String
- typeof (UInt16), // 12 TypeCode.UInt16
- typeof (UInt32), // 13 TypeCode.UInt32
- typeof (UInt64), // 14 TypeCode.UInt64
-
- // Invalid IConvertible Interface Types
- typeof (Object) // 15 TypeCode.Object
+ null, // 0 empty
+ typeof (object), // 1 TypeCode.Object
+ typeof (DBNull), // 2 TypeCode.DBNull
+ typeof (Boolean), // 3 TypeCode.Boolean
+ typeof (Char), // 4 TypeCode.Char
+ typeof (SByte), // 5 TypeCode.SByte
+ typeof (Byte), // 6 TypeCode.Byte
+ typeof (Int16), // 7 TypeCode.Int16
+ typeof (UInt16), // 8 TypeCode.UInt16
+ typeof (Int32), // 9 TypeCode.Int32
+ typeof (UInt32), // 10 TypeCode.UInt32
+ typeof (Int64), // 11 TypeCode.Int64
+ typeof (UInt64), // 12 TypeCode.UInt64
+ typeof (Single), // 13 TypeCode.Single
+ typeof (Double), // 14 TypeCode.Double
+ typeof (Decimal), // 15 TypeCode.Decimal
+ typeof (DateTime), // 16 TypeCode.DateTime
+ typeof (String), // 18 TypeCode.String
};
// Function to convert an object to another type and return
@@ -2331,86 +2331,67 @@
"Invalid conversion from null value"));
if (value is IConvertible) {
- IConvertible convertValue = (IConvertible)value;
+ IConvertible convertValue = (IConvertible) value;
- if (conversionType == conversionTable[0]) {
- // 0 TypeCode.Boolean
- return (object)(convertValue.ToBoolean (provider));
-
- } else if (conversionType == conversionTable[1]) {
- // 1 TypeCode.Byte
- return (object)(convertValue.ToByte (provider));
-
- } else if (conversionType == conversionTable[2]) {
- // 2 TypeCode.Char
- return (object)(convertValue.ToChar (provider));
-
- } else if (conversionType == conversionTable[3]) {
- // 3 TypeCode.DateTime
- return (object)(convertValue.ToDateTime (provider));
-
- } else if (conversionType == conversionTable[4]) {
- // 4 TypeCode.Decimal
- return (object)(convertValue.ToDecimal (provider));
-
- } else if (conversionType == conversionTable[5]) {
- // 5 TypeCode.Double
- return (object)(convertValue.ToDouble (provider));
-
- } else if (conversionType == conversionTable[6]) {
- // 6 TypeCode.Int16
- return (object)(convertValue.ToInt16 (provider));
-
- } else if (conversionType == conversionTable[7]) {
- // 7 TypeCode.Int32
- return (object)(convertValue.ToInt32 (provider));
-
- } else if (conversionType == conversionTable[8]) {
- // 8 TypeCode.Int64
- return (object)(convertValue.ToInt64 (provider));
-
- } else if (conversionType == conversionTable[9]) {
- // 9 TypeCode.Sbyte
- return (object)(convertValue.ToSByte (provider));
-
- } else if (conversionType == conversionTable[10]) {
- // 10 TypeCode.Single
- return (object)(convertValue.ToSingle (provider));
-
- } else if (conversionType == conversionTable[11]) {
- // 11 TypeCode.String
- return (object)(convertValue.ToString (provider));
-
- } else if (conversionType == conversionTable[12]) {
- // 12 TypeCode.UInt16
- return (object)(convertValue.ToUInt16 (provider));
-
- } else if (conversionType == conversionTable[13]) {
- // 13 TypeCode.UInt32
- return (object)(convertValue.ToUInt32 (provider));
-
- } else if (conversionType == conversionTable[14]) {
- // 14 TypeCode.UInt64
- return (object)(convertValue.ToUInt64 (provider));
-
- } else if (conversionType == conversionTable[15]) {
- // 15 TypeCode.Object
- return (object)(value);
-
- } else {
- // Not in the conversion table
- throw new InvalidCastException (Locale.GetText (
- "Unknown target conversion type"));
- }
- } else {
- // Value is not IConvertible
- throw new ArgumentException (Locale.GetText (
- "Value is not a convertible object: "+ value.GetType().ToString()+" to "+conversionType.ToString()));
- }
+ if (conversionType == conversionTable[0]) // 0 Empty
+ return null;
+
+ else if (conversionType == conversionTable[1]) // 1 TypeCode.Object
+ return (object) value;
+
+ // else if (conversionType == conversionTable[2]) // 2 TypeCode.DBNull
+ // return null; // It's not IConvertible
+
+ else if (conversionType == conversionTable[3]) // 3 TypeCode.Boolean
+ return (object) convertValue.ToBoolean (provider);
+
+ else if (conversionType == conversionTable[4]) // 4 TypeCode.Char
+ return (object) convertValue.ToChar (provider);
+
+ else if (conversionType == conversionTable[5]) // 5 TypeCode.SByte
+ return (object) convertValue.ToSByte (provider);
+
+ else if (conversionType == conversionTable[6]) // 6 TypeCode.Byte
+ return (object) convertValue.ToByte (provider);
+
+ else if (conversionType == conversionTable[7]) // 7 TypeCode.Int16
+ return (object) convertValue.ToInt16 (provider);
+
+ else if (conversionType == conversionTable[8]) // 8 TypeCode.UInt16
+ return (object) convertValue.ToUInt16 (provider);
+
+ else if (conversionType == conversionTable[9]) // 9 TypeCode.Int32
+ return (object) convertValue.ToInt32 (provider);
+
+ else if (conversionType == conversionTable[10]) // 10 TypeCode.UInt32
+ return (object) convertValue.ToUInt32 (provider);
+
+ else if (conversionType == conversionTable[11]) // 11 TypeCode.Int64
+ return (object) convertValue.ToInt64 (provider);
+
+ else if (conversionType == conversionTable[12]) // 12 TypeCode.UInt64
+ return (object) convertValue.ToUInt64 (provider);
+
+ else if (conversionType == conversionTable[13]) // 13 TypeCode.Single
+ return (object) convertValue.ToSingle (provider);
+
+ else if (conversionType == conversionTable[14]) // 14 TypeCode.Double
+ return (object) convertValue.ToDouble (provider);
+
+ else if (conversionType == conversionTable[15]) // 15 TypeCode.Decimal
+ return (object) convertValue.ToDecimal (provider);
+
+ else if (conversionType == conversionTable[16]) // 16 TypeCode.DateTime
+ return (object) convertValue.ToDateTime (provider);
+
+ else if (conversionType == conversionTable[18]) // 18 TypeCode.String
+ return (object) convertValue.ToString (provider);
+ else
+ throw new InvalidCastException (Locale.GetText ("Unknown target conversion type"));
+ } else
+ // Not in the conversion table
+ throw new ArgumentException ((Locale.GetText (
+ "Value is not a convertible object: " + value.GetType().ToString() + " to " + conversionType.ToString())));
}
}
}
-
-
-
-
Index: ChangeLog
===================================================================
RCS file: /cvs/public/mcs/class/corlib/System/ChangeLog,v
retrieving revision 1.328
diff -u -r1.328 ChangeLog
--- ChangeLog 21 May 2002 20:57:33 -0000 1.328
+++ ChangeLog 21 May 2002 22:19:28 -0000
@@ -1,5 +1,15 @@
2002-05-21 Duncan Mak <[EMAIL PROTECTED]>
+ * Convert.cs (ToType): Rearranged to fit the new layout of
+ conversionTable.
+
+ (conversionTable): Rearranged to fit the layout of the
+ System.TypeCode enum.
+
+ This should fix bug 25075.
+
+2002-05-21 Duncan Mak <[EMAIL PROTECTED]>
+
* Convert.cs (ToString): Fixed the ToString methods. Previously I had
mixed up the two code paths, one for converting to a specific base
(this case), another from converting from a foreign base to base10