2009-07-27 Miguel de Icaza <miguel@novell.com>
authorMiguel de Icaza <miguel@gnome.org>
Mon, 27 Jul 2009 14:55:16 +0000 (14:55 -0000)
committerMiguel de Icaza <miguel@gnome.org>
Mon, 27 Jul 2009 14:55:16 +0000 (14:55 -0000)
* Value types implementing IConvertible.ToType now throw an
ArgumentNullException if they are passed a null as the
"targetType" argument.

This code can not be put directly in the Convert.ToType method, as
this method is used by Convert.ToType (object o, TypeCode tc)
which uses null as a target to throw a different kind of error
(InvalidCastException).

Fixes a few more bugs in the Silverlight BCL test suite.

Additionally, the parameter type has been renamed.

svn path=/trunk/mcs/; revision=138730

19 files changed:
mcs/class/corlib/System/Boolean.cs
mcs/class/corlib/System/Byte.cs
mcs/class/corlib/System/ChangeLog
mcs/class/corlib/System/Char.cs
mcs/class/corlib/System/DBNull.cs
mcs/class/corlib/System/DateTime.cs
mcs/class/corlib/System/Decimal.cs
mcs/class/corlib/System/Double.cs
mcs/class/corlib/System/Enum.cs
mcs/class/corlib/System/Int16.cs
mcs/class/corlib/System/Int32.cs
mcs/class/corlib/System/Int64.cs
mcs/class/corlib/System/SByte.cs
mcs/class/corlib/System/Single.cs
mcs/class/corlib/System/String.cs
mcs/class/corlib/System/UInt16.cs
mcs/class/corlib/System/UInt32.cs
mcs/class/corlib/System/UInt64.cs
mcs/class/corlib/Test/System/ConvertTest.cs

index 21793eba8f9bdc1285c343ca7e971518d701f1dc..9c8b713e0f686f85a50435082ebb601847052c1f 100644 (file)
@@ -228,9 +228,11 @@ namespace System
                        return TypeCode.Boolean;
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return System.Convert.ToType (m_value, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       return System.Convert.ToType (m_value, targetType, provider, false);
                }
 
                bool IConvertible.ToBoolean (IFormatProvider provider)
index e85eca6144de4d30b1a2ae22534877251dc458d2..df638f2fac5c702e1e0dfe7a117e3404c0487af2 100644 (file)
@@ -168,9 +168,11 @@ namespace System
                        return TypeCode.Byte;
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return System.Convert.ToType (m_value, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       return System.Convert.ToType (m_value, targetType, provider, false);
                }
 
                bool IConvertible.ToBoolean (IFormatProvider provider)
index 158fec8c39d9437e427905f3c98101e10abd149d..c6542aeb5e61ad6c1ab22bf3525050268a4ff1ad 100644 (file)
@@ -1,3 +1,18 @@
+2009-07-27  Miguel de Icaza  <miguel@novell.com>
+
+       * Value types implementing IConvertible.ToType now throw an
+       ArgumentNullException if they are passed a null as the
+       "targetType" argument.
+
+       This code can not be put directly in the Convert.ToType method, as
+       this method is used by Convert.ToType (object o, TypeCode tc)
+       which uses null as a target to throw a different kind of error
+       (InvalidCastException).
+
+       Fixes a few more bugs in the Silverlight BCL test suite.
+
+       Additionally, the parameter type has been renamed.
+
 2009-07-26  Miguel de Icaza  <miguel@novell.com>
 
        * Type.cs: (GetMember) call directly the worker method, instead of
index 61e34724fdcff556b96421d8d2d9fd8a0b2b08b5..ea6882255707ec9d0d4858d9ddd9e4cf25147a14 100644 (file)
@@ -534,9 +534,11 @@ namespace System
                        return TypeCode.Char;
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return System.Convert.ToType (m_value, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       return System.Convert.ToType (m_value, targetType, provider, false);
                }
 
                bool IConvertible.ToBoolean (IFormatProvider provider)
index 0e345645a7eab06048d2fe53b5966d30a28ebb24..8c49b2308a39c407742b0c56021c6cfbc6b1c3f7 100644 (file)
@@ -129,11 +129,11 @@ namespace System
                        throw new InvalidCastException ();
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       if (type == typeof (string))
+                       if (targetType == typeof (string))
                                return String.Empty;
-                       if (type == typeof (DBNull))
+                       if (targetType == typeof (DBNull))
                                return this;
                        throw new InvalidCastException ();
                }
index 5c5ad4cf097d52e09272a4bbfbbbceb21dfc83b8..7514bef877b6740b631768a70f09e97b5322028b 100644 (file)
@@ -2228,16 +2228,16 @@ namespace System
                        throw new InvalidCastException();
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       if (type == null)
-                               throw new ArgumentNullException ("type");
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
 
-                       if (type == typeof (DateTime))
+                       if (targetType == typeof (DateTime))
                                return this;
-                       else if (type == typeof (String))
+                       else if (targetType == typeof (String))
                                return this.ToString (provider);
-                       else if (type == typeof (Object))
+                       else if (targetType == typeof (Object))
                                return this;
                        else
                                throw new InvalidCastException();
index 4c098d1eefc41e8b07686db4193f4242a3942f89..4fc0da72243e5b0b29397979a00b9a27a4af1958 100644 (file)
@@ -1238,9 +1238,11 @@ namespace System
                        return (UInt64)(Decimal.Truncate (d));
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return Convert.ToType (this, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       return Convert.ToType (this, targetType, provider, false);
                }
 
                bool IConvertible.ToBoolean (IFormatProvider provider)
index a18e5800aa67def1d912a421c6da98ee1dc1d4ec..fe4104172c700aecdf8663964ac43acf8b00ad5d 100644 (file)
@@ -529,9 +529,11 @@ namespace System {
                        return TypeCode.Double;
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return System.Convert.ToType (m_value, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       return System.Convert.ToType (m_value, targetType, provider, false);
                }
 
                bool IConvertible.ToBoolean (IFormatProvider provider)
index 833df359427be3e2e9d01f4d0f093f4a50d41bab..c223321f6fdad4c843b08d5b82a77d821e38b86e 100644 (file)
@@ -300,9 +300,11 @@ namespace System
                        return Convert.ToSingle (get_value (), provider);
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return Convert.ToType (get_value (), type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       return Convert.ToType (get_value (), targetType, provider, false);
                }
 
 #if ONLY_1_1
index 81b37894fd8b66ba3d13ae784bad114ba8c92ea2..18394d5cda13c533c65c50240ad1c36bb9fcd3dd 100644 (file)
@@ -328,9 +328,11 @@ namespace System {
                        return System.Convert.ToSingle (m_value);
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return System.Convert.ToType (m_value, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       return System.Convert.ToType (m_value, targetType, provider, false);
                }
 
 #if ONLY_1_1
index 712d0441f4514004823b5fc007e80aa4c55fd349..e573c48bad139c748f3acbfb81cd58d2fc5de72d 100644 (file)
@@ -710,9 +710,11 @@ namespace System {
                        return System.Convert.ToSingle (m_value);
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return System.Convert.ToType (m_value, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       return System.Convert.ToType (m_value, targetType, provider, false);
                }
 
 #if ONLY_1_1
index 968c50ba5bdd0aeebbb0daf620b8b97c25925c93..6b445659c575c85950ef5ec239411fab3038aa42 100644 (file)
@@ -584,9 +584,11 @@ namespace System {
                        return System.Convert.ToSingle (m_value);
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return System.Convert.ToType (m_value, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       return System.Convert.ToType (m_value, targetType, provider, false);
                }
 
 #if ONLY_1_1
index 4bf6460fa64dde9a9ace509847dcbb50ae73b7ac..2f42fbdbc368b474d852c450030539da33ac63ab 100644 (file)
@@ -324,9 +324,11 @@ namespace System
                        return System.Convert.ToSingle (m_value);
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return System.Convert.ToType (m_value, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       return System.Convert.ToType (m_value, targetType, provider, false);
                }
 
                ushort IConvertible.ToUInt16 (IFormatProvider provider)
index d1ec9eec56a3cb22ef216533ff082592feabae81..680321c53f07c278bd49dcaf0d78a5c58b980d9c 100644 (file)
@@ -320,9 +320,11 @@ namespace System
                        return System.Convert.ToSingle (m_value);
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return System.Convert.ToType (m_value, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       return System.Convert.ToType (m_value, targetType, provider, false);
                }
 
 #if ONLY_1_1
index 0cd58c4799dc00ae68063cd74c9920af77e016d2..533f74703dac055392593d96e2a56449b69901e3 100644 (file)
@@ -2436,9 +2436,11 @@ namespace System
                        return Convert.ToSingle (this, provider);
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return Convert.ToType (this, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("type");
+                       return Convert.ToType (this, targetType, provider, false);
                }
 
 #if ONLY_1_1
index 150ef0e9f34f49e3705f5c4af01e433198662a51..c04061b12d285a13767c3059b2acb3c4cceb6b26 100644 (file)
@@ -216,9 +216,12 @@ namespace System
                        return System.Convert.ToSingle (m_value);
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return System.Convert.ToType (m_value, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       
+                       return System.Convert.ToType (m_value, targetType, provider, false);
                }
 
 #if ONLY_1_1
index 26243315892091d14aa4a881f84f84f768fbdbeb..5cc7e3c6081335c8763809d2c5b6f83ea6fbd560 100644 (file)
@@ -538,9 +538,12 @@ namespace System
                        return System.Convert.ToSingle (m_value);
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return System.Convert.ToType (m_value, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       
+                       return System.Convert.ToType (m_value, targetType, provider, false);
                }
 
 #if ONLY_1_1
index 7d1aababc2e35b1dfb5e18929b93ec7811e3c0a4..732e2067c2bf6cdd7eee9e007ad3dec94a8ff632 100644 (file)
@@ -461,9 +461,12 @@ namespace System
                        return System.Convert.ToSingle (m_value);
                }
 
-               object IConvertible.ToType (Type type, IFormatProvider provider)
+               object IConvertible.ToType (Type targetType, IFormatProvider provider)
                {
-                       return System.Convert.ToType (m_value, type, provider, false);
+                       if (targetType == null)
+                               throw new ArgumentNullException ("targetType");
+                       
+                       return System.Convert.ToType (m_value, targetType, provider, false);
                }
 
 #if ONLY_1_1
index 9fad132fe39781847293ec36b0c48d70a22baad2..a06b91ac19d472f9b658cc3caaeceb8516394ec8 100644 (file)
@@ -3603,6 +3603,24 @@ namespace MonoTests.System {
                        Convert.ChangeType (true, TypeCode.Empty);
                }
 
+               [Test]
+               [ExpectedException (typeof (ArgumentNullException))]
+               public void CharChangeTypeNullNull ()
+               {
+                       char a = 'a';
+                       IConvertible convert = a;
+                       convert.ToType (null, null);
+               }
+
+               [Test]
+               [ExpectedException (typeof (ArgumentNullException))]
+               public void StringChangeTypeNullNull ()
+               {
+                       string a = "a";
+                       IConvertible convert = a;
+                       convert.ToType (null, null);
+               }
+
                [Test]
                // 2005/01/10: The docs say this should throw an InvalidCastException,
                // however, MS.NET 1.1 throws a NullReferenceException. Assuming docs