[jit] Implement support for UnsafeMov in gshared code.
authorZoltan Varga <vargaz@gmail.com>
Mon, 8 Jun 2015 17:22:20 +0000 (13:22 -0400)
committerZoltan Varga <vargaz@gmail.com>
Mon, 8 Jun 2015 17:22:20 +0000 (13:22 -0400)
mono/mini/aot-tests.cs
mono/mini/method-to-ir.c

index 7324fe21f370de11f66557651213a618dbf2ff89..1413b15bae4c42e5caeb3b2095294e7848b5e7b5 100644 (file)
@@ -240,4 +240,14 @@ class Tests
                        return 3;
                return 0;
        }
+
+       enum AnEnum {
+               A = 0,
+               B = 1
+       }
+
+       public static int test_0_enum_eq_comparer () {
+               var c = EqualityComparer<AnEnum>.Default;
+               return (!c.Equals (AnEnum.A, AnEnum.B) && c.Equals (AnEnum.A, AnEnum.A)) ? 0 : 1;
+       }
 }
index d27e1fda45c473ac244f5078f8090db9d79f94dc..52303fbfd735c1261e438d6013e7de00e9f5e276 100644 (file)
@@ -5546,10 +5546,12 @@ emit_array_unsafe_access (MonoCompile *cfg, MonoMethodSignature *fsig, MonoInst
 }
 
 static gboolean
-is_unsafe_mov_compatible (MonoClass *param_klass, MonoClass *return_klass)
+is_unsafe_mov_compatible (MonoCompile *cfg, MonoClass *param_klass, MonoClass *return_klass)
 {
        uint32_t align;
 
+       param_klass = mono_class_from_mono_type (mini_get_underlying_type (cfg, &param_klass->byval_arg));
+
        //Only allow for valuetypes
        if (!param_klass->valuetype || !return_klass->valuetype)
                return FALSE;
@@ -5580,11 +5582,11 @@ emit_array_unsafe_mov (MonoCompile *cfg, MonoMethodSignature *fsig, MonoInst **a
        MonoClass *return_klass = mono_class_from_mono_type (fsig->ret);
 
        //Valuetypes that are semantically equivalent
-       if (is_unsafe_mov_compatible (param_klass, return_klass))
+       if (is_unsafe_mov_compatible (cfg, param_klass, return_klass))
                return args [0];
 
        //Arrays of valuetypes that are semantically equivalent
-       if (param_klass->rank == 1 && return_klass->rank == 1 && is_unsafe_mov_compatible (param_klass->element_class, return_klass->element_class))
+       if (param_klass->rank == 1 && return_klass->rank == 1 && is_unsafe_mov_compatible (cfg, param_klass->element_class, return_klass->element_class))
                return args [0];
 
        return NULL;