summaryrefslogtreecommitdiff
blob: 1be03542a375b5d16240bec08f50a23fcf18c9b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# http://gna.org/bugs/?12900
# https://bugzilla.novell.com/show_bug.cgi?id=469213
# http://bugs.gentoo.org/show_bug.cgi?id=256153

Index: mono/mono/mini/method-to-ir.c
===================================================================
--- mono/mono/mini/method-to-ir.c	(revision 123986)
+++ mono/mono/mini/method-to-ir.c	(revision 123987)
@@ -5839,7 +5839,21 @@
 					cmethod =  (MonoMethod *)mono_method_get_wrapper_data (method, token);
 					cil_method = cmethod;
 				} else if (constrained_call) {
-					cmethod = mono_get_method_constrained (image, token, constrained_call, generic_context, &cil_method);
+					if ((constrained_call->byval_arg.type == MONO_TYPE_VAR || constrained_call->byval_arg.type == MONO_TYPE_MVAR) && cfg->generic_sharing_context) {
+						/* This is needed when using aot + generic sharing, since 
+						 * the AOT code allows generic sharing for methods with 
+						 * type parameters having constraints, and 
+						 * get_method_constrained can't find the method in klass 
+						 * representing a type var.
+						 * The type var is guaranteed to be a reference type in this
+						 * case.
+						 */
+						cmethod = mini_get_method (cfg, method, token, NULL, generic_context);
+						cil_method = cmethod;
+						g_assert (!cmethod->klass->valuetype);
+					} else {
+						cmethod = mono_get_method_constrained (image, token, constrained_call, generic_context, &cil_method);
+					}
 				} else {
 					cmethod = mini_get_method (cfg, method, token, NULL, generic_context);
 					cil_method = cmethod;