[aot] Fix support for synchronized wrappers of gsharedvt methods.
authorZoltan Varga <vargaz@gmail.com>
Thu, 19 Nov 2015 11:09:42 +0000 (06:09 -0500)
committerZoltan Varga <vargaz@gmail.com>
Thu, 19 Nov 2015 11:09:48 +0000 (06:09 -0500)
mono/metadata/marshal.c
mono/mini/aot-runtime.c

index 4a2de28586961787758d9773ba6223c42b0c4b9e..d09c52dc46f0e2f44abe9270698758d1d1db8aff 100644 (file)
@@ -2453,7 +2453,15 @@ mono_marshal_method_from_wrapper (MonoMethod *wrapper)
                }
                return m;
        case MONO_WRAPPER_SYNCHRONIZED:
-               return info->d.synchronized.method;
+               m = info->d.synchronized.method;
+               if (wrapper->is_inflated) {
+                       MonoError error;
+                       MonoMethod *result;
+                       result = mono_class_inflate_generic_method_checked (m, mono_method_get_context (wrapper), &error);
+                       g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */
+                       return result;
+               }
+               return m;
        case MONO_WRAPPER_UNBOX:
                return info->d.unbox.method;
        case MONO_WRAPPER_MANAGED_TO_NATIVE:
index 8129bc114e0f17af24460cf8ee1e2bb8d0419a1a..3091cab90549320f868f5dc2f5c385c909fc21b8 100644 (file)
@@ -3840,7 +3840,7 @@ find_aot_method_in_amodule (MonoAotModule *amodule, MonoMethod *method, guint32
                        MonoMethod *w1 = mono_marshal_method_from_wrapper (method);
                        MonoMethod *w2 = mono_marshal_method_from_wrapper (m);
 
-                       if (w1->is_inflated && ((MonoMethodInflated *)w1)->declaring == w2) {
+                       if ((w1 == w2) || (w1->is_inflated && ((MonoMethodInflated *)w1)->declaring == w2)) {
                                index = value;
                                break;
                        }