[corlib] Make primitive types smaller than int compare result compatible
authorMarek Safar <marek.safar@gmail.com>
Fri, 7 Feb 2014 19:19:16 +0000 (20:19 +0100)
committerMarek Safar <marek.safar@gmail.com>
Fri, 7 Feb 2014 19:19:16 +0000 (20:19 +0100)
mcs/class/corlib/System/Byte.cs
mcs/class/corlib/System/Int16.cs
mcs/class/corlib/System/SByte.cs
mcs/class/corlib/System/UInt16.cs
mcs/class/corlib/Test/System/ByteTest.cs
mcs/class/corlib/Test/System/EnumTest.cs
mcs/class/corlib/Test/System/Int16Test.cs
mcs/class/corlib/Test/System/SByteTest.cs
mcs/class/corlib/Test/System/UInt16Test.cs
mono/metadata/icall.c

index 74060f07979822a0342b66c3349a279d45deb737..ae039affd3b59576657e7ca3651a10ee2211e626 100644 (file)
@@ -51,14 +51,7 @@ namespace System
                        if (!(value is System.Byte))
                                throw new ArgumentException (Locale.GetText ("Value is not a System.Byte."));
 
-                       byte xv = (byte) value;
-
-                       if (m_value == xv)
-                               return 0;
-                       if (m_value > xv)
-                               return 1;
-                       else
-                               return -1;
+                       return CompareTo ((byte) value);
                }
 
                public override bool Equals (object obj)
@@ -76,12 +69,7 @@ namespace System
 
                public int CompareTo (byte value)
                {
-                       if (m_value == value)
-                               return 0;
-                       if (m_value > value)
-                               return 1;
-                       else
-                               return -1;
+                       return m_value - value;
                }
 
                public bool Equals (byte obj)
index 2b62743b1296d7eea3beec1034e51a04ba5e78ed..d3c0029bb57645de0bbaa14325922b6555d251fa 100644 (file)
@@ -49,13 +49,7 @@ namespace System {
                        if (!(value is System.Int16))
                                throw new ArgumentException (Locale.GetText ("Value is not a System.Int16"));
 
-                       short xv = (short) value;
-                       if (m_value == xv)
-                               return 0;
-                       if (m_value > xv)
-                               return 1;
-                       else
-                               return -1;
+                       return CompareTo ((short) value);
                }
 
                public override bool Equals (object obj)
@@ -73,12 +67,7 @@ namespace System {
 
                public int CompareTo (short value)
                {
-                       if (m_value == value)
-                               return 0;
-                       if (m_value > value)
-                               return 1;
-                       else
-                               return -1;
+                       return m_value - value;
                }
 
                public bool Equals (short obj)
index a58af2cd19f84167111c4d8cd18161c4bc36928a..65ed874d772566b5faac61a4a11928035e79e620 100644 (file)
@@ -49,13 +49,7 @@ namespace System
                        if (!(obj is System.SByte))
                                throw new ArgumentException (Locale.GetText ("Value is not a System.SByte."));
 
-                       sbyte xv = (sbyte) obj;
-                       if (m_value == xv)
-                               return 0;
-                       if (m_value > xv)
-                               return 1;
-                       else
-                               return -1;
+                       return CompareTo ((sbyte) obj);
                }
 
                public override bool Equals (object obj)
@@ -73,12 +67,7 @@ namespace System
 
                public int CompareTo (sbyte value)
                {
-                       if (m_value == value)
-                               return 0;
-                       if (m_value > value)
-                               return 1;
-                       else
-                               return -1;
+                       return m_value - value;
                }
 
                public bool Equals (sbyte obj)
index 3dbed2e151d12d26124fb1040107d96a1dab7a01..42ceeb7205aa99308d3bf731df0415edcb7528f1 100644 (file)
@@ -49,7 +49,7 @@ namespace System
                        if(!(value is System.UInt16))
                                throw new ArgumentException (Locale.GetText ("Value is not a System.UInt16."));
 
-                       return this.m_value - ((ushort) value);
+                       return CompareTo ((ushort) value);
                }
 
                public override bool Equals (object obj)
index 1f7bb4fbd9acb0430de250cbf49482171e4be337..43a1492055325404b03348be5a9c41dbaa607875 100644 (file)
@@ -95,27 +95,28 @@ public class ByteTest
                Thread.CurrentThread.CurrentCulture = old_culture;
        }
 
+       [Test]
        public void TestMinMax()
        {
                Assert.AreEqual(Byte.MinValue, MyByte2);
                Assert.AreEqual(Byte.MaxValue, MyByte3);
        }
-       
+
+       [Test]  
        public void TestCompareTo()
        {
-               Assert.IsTrue (MyByte3.CompareTo(MyByte2) > 0);
-               Assert.IsTrue (MyByte2.CompareTo(MyByte2) == 0);
-               Assert.IsTrue (MyByte1.CompareTo((object)(Byte)42) == 0);
-               Assert.IsTrue (MyByte2.CompareTo(MyByte3) < 0);
+               Assert.AreEqual (255, MyByte3.CompareTo(MyByte2), "#1");
+               Assert.AreEqual (0, MyByte2.CompareTo(MyByte2), "#2");
+               Assert.AreEqual (0, MyByte1.CompareTo((object)(Byte)42), "#3");
+               Assert.AreEqual (-255, MyByte2.CompareTo(MyByte3), "#4");
                try {
                        MyByte2.CompareTo((object)100);
                        Assert.Fail ("Should raise a System.ArgumentException");
-               }
-               catch (Exception e) {
-                       Assert.IsTrue (typeof(ArgumentException) == e.GetType());
+               } catch (ArgumentException e) {
                }
        }
 
+       [Test]
        public void TestEquals()
        {
                Assert.IsTrue (MyByte1.Equals(MyByte1));
@@ -124,6 +125,7 @@ public class ByteTest
                Assert.IsTrue (MyByte1.Equals(MyByte2) == false);
        }
        
+       [Test]
        public void TestGetHashCode()
        {
                try {
@@ -136,6 +138,7 @@ public class ByteTest
                }
        }
        
+       [Test]
        public void TestParse()
        {
                //test Parse(string s)
@@ -201,7 +204,7 @@ public class ByteTest
                Byte.Parse(OverInt.ToString());
        }
 
-
+       [Test]
        public void TestToString()
        {
                //test ToString()
index 973b068e823ee28ebde1fcd9d94ce270b8aa8a4a..4425baaaf85096fb16deaf3dfc370f7116bef921 100644 (file)
@@ -975,23 +975,23 @@ namespace MonoTests.System
                }
 
                [Test]
-               public void CompareTo_ShouldBeEqualToUnderlyingType ()
+               public void CompareTo_NotEqualToUnderlyingType ()
                {
-                       Assert.AreEqual (sbyte.MinValue.CompareTo (sbyte.MinValue), EnInt8.A.CompareTo (EnInt8.A), "i8#0");
-                       Assert.AreEqual (sbyte.MinValue.CompareTo ((sbyte)44), EnInt8.A.CompareTo (EnInt8.B), "i8#1");
-                       Assert.AreEqual (((sbyte)44).CompareTo (sbyte.MinValue), EnInt8.B.CompareTo (EnInt8.A), "i8#2");
+                       Assert.AreEqual (0, EnInt8.A.CompareTo (EnInt8.A), "i8#0");
+                       Assert.AreEqual (-1, EnInt8.A.CompareTo (EnInt8.B), "i8#1");
+                       Assert.AreEqual (1, EnInt8.B.CompareTo (EnInt8.A), "i8#2");
        
-                       Assert.AreEqual (byte.MinValue.CompareTo (byte.MinValue), EnUInt8.A.CompareTo (EnUInt8.A), "ui8#0");
-                       Assert.AreEqual (byte.MinValue.CompareTo ((byte)55),  EnUInt8.A.CompareTo (EnUInt8.B), "ui8#1");
-                       Assert.AreEqual (((byte)55).CompareTo (byte.MinValue), EnUInt8.B.CompareTo (EnUInt8.A),"ui8#2");
+                       Assert.AreEqual (0, EnUInt8.A.CompareTo (EnUInt8.A), "ui8#0");
+                       Assert.AreEqual (-1,  EnUInt8.A.CompareTo (EnUInt8.B), "ui8#1");
+                       Assert.AreEqual (1, EnUInt8.B.CompareTo (EnUInt8.A),"ui8#2");
 
-                       Assert.AreEqual (short.MinValue.CompareTo (short.MinValue), EnInt16.A.CompareTo (EnInt16.A), "i16#0");
-                       Assert.AreEqual (short.MinValue.CompareTo ((short)66), EnInt16.A.CompareTo (EnInt16.B), "i16#1");
-                       Assert.AreEqual (((short)66).CompareTo (short.MinValue), EnInt16.B.CompareTo (EnInt16.A), "i16#2");
+                       Assert.AreEqual (0, EnInt16.A.CompareTo (EnInt16.A), "i16#0");
+                       Assert.AreEqual (-1, EnInt16.A.CompareTo (EnInt16.B), "i16#1");
+                       Assert.AreEqual (1, EnInt16.B.CompareTo (EnInt16.A), "i16#2");
 
-                       Assert.AreEqual (ushort.MinValue.CompareTo (ushort.MinValue), EnUInt16.A.CompareTo (EnUInt16.A), "ui16#0");
-                       Assert.AreEqual (ushort.MinValue.CompareTo ((ushort)77), EnUInt16.A.CompareTo (EnUInt16.B), "ui16#1");
-                       Assert.AreEqual (((ushort)77).CompareTo (ushort.MinValue), EnUInt16.B.CompareTo (EnUInt16.A), "ui16#2");
+                       Assert.AreEqual (0, EnUInt16.A.CompareTo (EnUInt16.A), "ui16#0");
+                       Assert.AreEqual (-1, EnUInt16.A.CompareTo (EnUInt16.B), "ui16#1");
+                       Assert.AreEqual (1, EnUInt16.B.CompareTo (EnUInt16.A), "ui16#2");
 
                        Assert.AreEqual (int.MinValue.CompareTo (int.MinValue), EnInt32.A.CompareTo (EnInt32.A), "i32#0");
                        Assert.AreEqual (int.MinValue.CompareTo ((int)88), EnInt32.A.CompareTo (EnInt32.B), "i32#1");
index 126c46917b0db515fafb610e55475457de61a674..93317046963230c0fed81c4b0bbb9fd69e41949a 100644 (file)
@@ -71,16 +71,14 @@ public class Int16Test
        [Test]  
        public void TestCompareTo()
        {
-               Assert.IsTrue(MyInt16_3.CompareTo(MyInt16_2) > 0);
-               Assert.IsTrue(MyInt16_2.CompareTo(MyInt16_2) == 0);
-               Assert.IsTrue(MyInt16_1.CompareTo((Int16)(-42)) == 0);
-               Assert.IsTrue(MyInt16_2.CompareTo(MyInt16_3) < 0);
+               Assert.AreEqual(65535, MyInt16_3.CompareTo(MyInt16_2), "#1");
+               Assert.AreEqual(0, MyInt16_2.CompareTo(MyInt16_2), "#2");
+               Assert.AreEqual(0, MyInt16_1.CompareTo((Int16)(-42)), "#3");
+               Assert.AreEqual(-65535, MyInt16_2.CompareTo(MyInt16_3), "#4");
                try {
                        MyInt16_2.CompareTo((object)100);
                        Assert.Fail ("Should raise a System.ArgumentException");
-               }
-               catch (Exception e) {
-                       Assert.IsTrue(typeof(ArgumentException) == e.GetType());
+               } catch (ArgumentException e) {
                }
        }
 
index 5fff918e8f9653c5afc9504e3749ee1c4fc2a491..9bf4d31a1cdffbcad8fd171426f40cff6c1971ce 100644 (file)
@@ -48,16 +48,14 @@ public class SByteTest
        [Test]
        public void TestCompareTo()
        {
-               Assert.IsTrue(MySByte3.CompareTo(MySByte2) > 0);
-               Assert.IsTrue(MySByte2.CompareTo(MySByte2) == 0);
-               Assert.IsTrue(MySByte1.CompareTo((SByte)(-42)) == 0);
-               Assert.IsTrue(MySByte2.CompareTo(MySByte3) < 0);
+               Assert.AreEqual(255, MySByte3.CompareTo(MySByte2), "#1");
+               Assert.AreEqual(0, MySByte2.CompareTo(MySByte2), "#2");
+               Assert.AreEqual(0, MySByte1.CompareTo((SByte)(-42)), "#3");
+               Assert.AreEqual(-255, MySByte2.CompareTo(MySByte3), "#4");
                try {
                        MySByte2.CompareTo((object)(int)100);
                        Assert.Fail("Should raise a System.ArgumentException");
-               }
-               catch (Exception e) {
-                       Assert.IsTrue(typeof(ArgumentException) == e.GetType());
+               } catch (ArgumentException e) {
                }
        }
 
index 154f085d71436b10d26fdb0394eae89dfb638a77..a0b8565e045d0d0aef818226a82e1d4774ffad0b 100644 (file)
@@ -78,16 +78,14 @@ public class UInt16Test
        [Test]
        public void TestCompareTo()
        {
-               Assert.IsTrue(MyUInt16_3.CompareTo(MyUInt16_2) > 0);
-               Assert.IsTrue(MyUInt16_2.CompareTo(MyUInt16_2) == 0);
-               Assert.IsTrue(MyUInt16_1.CompareTo((UInt16)(42)) == 0);
-               Assert.IsTrue(MyUInt16_2.CompareTo(MyUInt16_3) < 0);
+               Assert.AreEqual(65535, MyUInt16_3.CompareTo(MyUInt16_2), "#1");
+               Assert.AreEqual(0, MyUInt16_2.CompareTo(MyUInt16_2), "#2");
+               Assert.AreEqual(0, MyUInt16_1.CompareTo((UInt16)(42)), "#3");
+               Assert.AreEqual(-65535, MyUInt16_2.CompareTo(MyUInt16_3), "#4");
                try {
                        MyUInt16_2.CompareTo((object)100);
                        Assert.Fail("Should raise a System.ArgumentException");
-               }
-               catch (Exception e) {
-                       Assert.IsTrue(typeof(ArgumentException) == e.GetType());
+               } catch (ArgumentException e) {
                }
        }
 
index e080faa70a7c240d41b3b4a6ebf61a6e6069c024..6aec1fcbab8c7c20fb728bd472943978627af848 100644 (file)
@@ -5,10 +5,11 @@
  *   Dietmar Maurer (dietmar@ximian.com)
  *   Paolo Molaro (lupus@ximian.com)
  *      Patrik Torstensson (patrik.torstensson@labs2.com)
+ *   Marek Safar (marek.safar@gmail.com)
  *
  * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)
  * Copyright 2004-2009 Novell, Inc (http://www.novell.com)
- * Copyright 2011-2012 Xamarin Inc (http://www.xamarin.com).
+ * Copyright 2011-2014 Xamarin Inc (http://www.xamarin.com).
  */
 
 #include <config.h>
@@ -3134,14 +3135,6 @@ ves_icall_System_Enum_compare_value_to (MonoObject *this, MonoObject *other)
                return me > other ? 1 : -1; \
        } while (0)
 
-#define COMPARE_ENUM_VALUES_RANGE(ENUM_TYPE) do { \
-               ENUM_TYPE me = *((ENUM_TYPE*)tdata); \
-               ENUM_TYPE other = *((ENUM_TYPE*)odata); \
-               if (me == other) \
-                       return 0; \
-               return me - other; \
-       } while (0)
-
        switch (basetype->type) {
                case MONO_TYPE_U1:
                        COMPARE_ENUM_VALUES (guint8);
@@ -3149,7 +3142,7 @@ ves_icall_System_Enum_compare_value_to (MonoObject *this, MonoObject *other)
                        COMPARE_ENUM_VALUES (gint8);
                case MONO_TYPE_CHAR:
                case MONO_TYPE_U2:
-                       COMPARE_ENUM_VALUES_RANGE (guint16);
+                       COMPARE_ENUM_VALUES (guint16);
                case MONO_TYPE_I2:
                        COMPARE_ENUM_VALUES (gint16);
                case MONO_TYPE_U4:
@@ -3163,7 +3156,6 @@ ves_icall_System_Enum_compare_value_to (MonoObject *this, MonoObject *other)
                default:
                        g_error ("Implement type 0x%02x in get_hashcode", basetype->type);
        }
-#undef COMPARE_ENUM_VALUES_RANGE
 #undef COMPARE_ENUM_VALUES
        return 0;
 }