From: Zoltan Varga Date: Fri, 22 Oct 2010 15:56:26 +0000 (+0200) Subject: Emit GenericEqualityComparer instances for each EqualityComparer instance in... X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=b50141c93a330ab924f0412e0ca0822907b85999;p=mono.git Emit GenericEqualityComparer instances for each EqualityComparer instance in AOT, the former is created dynamically by the latter. --- diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c index 7c0f43d34cc..5088324c0b5 100644 --- a/mono/mini/aot-compiler.c +++ b/mono/mini/aot-compiler.c @@ -2697,6 +2697,25 @@ add_generic_class_with_depth (MonoAotCompile *acfg, MonoClass *klass, int depth) add_generic_class (acfg, mono_class_inflate_generic_class (gcomparer, &ctx)); } } + + /* Add an instance of GenericEqualityComparer which is created dynamically by EqualityComparer */ + if (klass->image == mono_defaults.corlib && !strcmp (klass->name_space, "System.Collections.Generic") && !strcmp (klass->name, "EqualityComparer`1")) { + MonoClass *tclass = mono_class_from_mono_type (klass->generic_class->context.class_inst->type_argv [0]); + MonoClass *icomparable, *gcomparer; + MonoGenericContext ctx; + MonoType *args [16]; + + memset (&ctx, 0, sizeof (ctx)); + + icomparable = mono_class_from_name (mono_defaults.corlib, "System", "IComparable`1"); + g_assert (icomparable); + args [0] = &tclass->byval_arg; + ctx.class_inst = mono_metadata_get_generic_inst (1, args); + + gcomparer = mono_class_from_name (mono_defaults.corlib, "System.Collections.Generic", "GenericEqualityComparer`1"); + g_assert (gcomparer); + add_generic_class (acfg, mono_class_inflate_generic_class (gcomparer, &ctx)); + } } static void diff --git a/mono/mini/generics.cs b/mono/mini/generics.cs index 5fce0b601bb..b7a33513ad9 100644 --- a/mono/mini/generics.cs +++ b/mono/mini/generics.cs @@ -490,6 +490,11 @@ class Tests { return l.Count; } + public static int test_0_fullaot_comparer_t_2 () { + var l = new Dictionary (); + return l.Count; + } + static void enumerate (IEnumerable arr) { foreach (var o in arr) ;