[interpreter] it can happen that we have the address of a enum on the stack, and...
authorBernhard Urban <bernhard.urban@xamarin.com>
Mon, 27 Feb 2017 16:55:54 +0000 (17:55 +0100)
committerBernhard Urban <bernhard.urban@xamarin.com>
Tue, 28 Feb 2017 21:59:28 +0000 (22:59 +0100)
mono/mini/generics.cs
mono/mini/interpreter/transform.c

index 5b7618a9d50ce79cb362288571d898bf1766d85f..83925dac60ad907a325f134fb5cb277c255f4ef5 100644 (file)
@@ -552,7 +552,6 @@ class Tests
                Value_2 = 2
        }
 
-       [Category ("!INTERPRETER")]
        public static int test_0_regress_550964_constrained_enum_long () {
         MyEnumUlong a = MyEnumUlong.Value_2;
         MyEnumUlong b = MyEnumUlong.Value_2;
index 7aa65c5d0c17b0a47883e6e0788601380988e66e..25ef75337309aa249845c124a12020f4ab853ac0 100644 (file)
@@ -722,6 +722,11 @@ interp_transform_call (TransformData *td, MonoMethod *method, MonoMethod *target
                mono_class_setup_vtable (target_method->klass);
 
                if (constrained_class->valuetype && (target_method->klass == mono_defaults.object_class || target_method->klass == mono_defaults.enum_class->parent || target_method->klass == mono_defaults.enum_class)) {
+                       if (target_method->klass == mono_defaults.enum_class && (td->sp - csignature->param_count - 1)->type == STACK_TYPE_MP) {
+                               /* managed pointer on the stack, we need to deref that puppy */
+                               ADD_CODE (td, MINT_LDIND_I);
+                               ADD_CODE (td, csignature->param_count);
+                       }
                        ADD_CODE (td, MINT_BOX);
                        ADD_CODE (td, get_data_item_index (td, constrained_class));
                        ADD_CODE (td, csignature->param_count);