[aot] Fix full-aot support for Comparer instances instantiated with enums.
authorZoltan Varga <vargaz@gmail.com>
Mon, 8 Jun 2015 17:31:38 +0000 (13:31 -0400)
committerZoltan Varga <vargaz@gmail.com>
Mon, 8 Jun 2015 17:31:38 +0000 (13:31 -0400)
mono/mini/aot-compiler.c
mono/mini/aot-tests.cs

index 83ee1e562114f1e8017833f3eebc06c9cf75b77e..40f7b324b5cf72f5bce0fd71d6a1c4c37fca900c 100644 (file)
@@ -4249,6 +4249,24 @@ add_generic_class_with_depth (MonoAotCompile *acfg, MonoClass *klass, int depth,
                        add_generic_class (acfg, mono_class_inflate_generic_class (enum_comparer, &ctx), FALSE, "EqualityComparer<T>");
                }
        }
+
+       /* Add an instance of ObjectComparer<T> which is created dynamically by Comparer<T> for enums */
+       if (klass->image == mono_defaults.corlib && !strcmp (klass->name_space, "System.Collections.Generic") && !strcmp (klass->name, "Comparer`1")) {
+               MonoClass *comparer;
+               MonoClass *tclass = mono_class_from_mono_type (klass->generic_class->context.class_inst->type_argv [0]);
+               MonoGenericContext ctx;
+               MonoType *args [16];
+
+               if (mono_class_is_enum (tclass)) {
+                       memset (&ctx, 0, sizeof (ctx));
+                       args [0] = &tclass->byval_arg;
+                       ctx.class_inst = mono_metadata_get_generic_inst (1, args);
+
+                       comparer = mono_class_from_name (mono_defaults.corlib, "System.Collections.Generic", "ObjectComparer`1");
+                       g_assert (comparer);
+                       add_generic_class (acfg, mono_class_inflate_generic_class (comparer, &ctx), FALSE, "Comparer<T>");
+               }
+       }
 }
 
 static void
index 1413b15bae4c42e5caeb3b2095294e7848b5e7b5..9ec39eb9e1b1818c4f407953195c7e7db0bb3a76 100644 (file)
@@ -250,4 +250,9 @@ class Tests
                var c = EqualityComparer<AnEnum>.Default;
                return (!c.Equals (AnEnum.A, AnEnum.B) && c.Equals (AnEnum.A, AnEnum.A)) ? 0 : 1;
        }
+
+       public static int test_0_enum_comparer () {
+               var c = Comparer<AnEnum>.Default;
+               return c.Compare (AnEnum.A, AnEnum.A);
+       }
 }