[interp] throw overflow exception on long to ulong cast where long is negative
authorBernhard Urban <bernhard.urban@xamarin.com>
Tue, 7 Mar 2017 09:47:00 +0000 (10:47 +0100)
committerBernhard Urban <bernhard.urban@xamarin.com>
Wed, 8 Mar 2017 22:02:51 +0000 (23:02 +0100)
mono/mini/exceptions.cs
mono/mini/interp/interp.c
mono/mini/interp/mintops.def
mono/mini/interp/transform.c

index 86cec08c3eb3a69530b21943a295c7b8d9aef961..cf1fbb9ec1ce80955cdb54121f5ec3ff130581b6 100644 (file)
@@ -1815,7 +1815,6 @@ class Tests
                return 3;
        }
        
-       [Category ("!INTERPRETER")]
        public static int test_4_checked_cast () {
                 long i;
                 ulong j;
index 3b5307f13e418bb8d1dca785a9f1eb30466eafa5..c08dfd192704db454fa71a7e9f4196fb1a5e9099 100644 (file)
@@ -3168,6 +3168,11 @@ array_constructed:
                        sp [-1].data.l = sp [-1].data.i;
                        ++ip;
                        MINT_IN_BREAK;
+               MINT_IN_CASE(MINT_CONV_OVF_U8_I8)
+                       if (sp [-1].data.l < 0)
+                               THROW_EX (mono_get_exception_overflow (), ip);
+                       ++ip;
+                       MINT_IN_BREAK;
                MINT_IN_CASE(MINT_CONV_OVF_I8_U8)
                        if ((guint64) sp [-1].data.l > MYGINT64_MAX)
                                THROW_EX (mono_get_exception_overflow (), ip);
index 21ad893d07fda7abcddf4625ff5a0b4f61c05936..18128154af6ad06c4a8a412ff39c2f6db7787b08 100644 (file)
@@ -461,6 +461,7 @@ OPDEF(MINT_CONV_OVF_I8_R8, "conv.ovf.i8.r8", 1, MintOpNoArgs)
 OPDEF(MINT_CONV_OVF_I8_UN_R8, "conv.ovf.i8.un.r8", 1, MintOpNoArgs)
 
 OPDEF(MINT_CONV_OVF_U8_I4, "conv.ovf.u8.i4", 1, MintOpNoArgs)
+OPDEF(MINT_CONV_OVF_U8_I8, "conv.ovf.u8.i8", 1, MintOpNoArgs)
 OPDEF(MINT_CONV_OVF_U8_R8, "conv.ovf.u8.r8", 1, MintOpNoArgs)
 
 OPDEF(MINT_CEQ_I4, "ceq.i4", 1, MintOpNoArgs)
index 434e2cdb0c4d4c2bddadb180fe4dc579a0efdd5b..515c7da81ba93d9e956d4d6eedf6908107b3ab2d 100644 (file)
@@ -2685,6 +2685,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                                ADD_CODE(&td, MINT_CONV_OVF_U8_I4);
                                break;
                        case STACK_TYPE_I8:
+                               ADD_CODE (&td, MINT_CONV_OVF_U8_I8);
                                break;
                        default:
                                g_assert_not_reached ();