32 lines
1.5 KiB
Diff
32 lines
1.5 KiB
Diff
|
# 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;
|