[runtime] Store the original invoke method in WrapperInfo for delegate invokes, use...
authorZoltan Varga <vargaz@gmail.com>
Fri, 5 Aug 2016 22:58:58 +0000 (18:58 -0400)
committerZoltan Varga <vargaz@gmail.com>
Fri, 5 Aug 2016 22:59:07 +0000 (18:59 -0400)
mono/metadata/marshal.c
mono/metadata/marshal.h
mono/mini/aot-runtime.c

index 86229fbe3284a572d97ff84ba64aa4f3d1216be7..2876a387a353adcda16b1f6f06b5fb58faf57d05 100644 (file)
@@ -3405,7 +3405,6 @@ mono_marshal_get_delegate_invoke_internal (MonoMethod *method, gboolean callvirt
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
        mono_mb_emit_stloc (mb, local_delegates);
 
-
        /* if (delegates == null) */
        mono_mb_emit_ldloc (mb, local_delegates);
        pos2 = mono_mb_emit_branch (mb, CEE_BRTRUE);
@@ -3539,6 +3538,7 @@ mono_marshal_get_delegate_invoke_internal (MonoMethod *method, gboolean callvirt
 #endif /* DISABLE_JIT */
 
        info = mono_wrapper_info_create (mb, subtype);
+       info->d.delegate_invoke.method = method;
 
        if (ctx) {
                MonoMethod *def;
index d3c0a2b051762f2ec82b4f7b8095a053f78c9e9b..512d44b421193642b7ec40979bdbca756d973ae6 100644 (file)
@@ -191,6 +191,10 @@ typedef struct {
        MonoMethodSignature *sig;
 } GsharedvtWrapperInfo;
 
+typedef struct {
+       MonoMethod *method;
+} DelegateInvokeWrapperInfo;
+
 /*
  * This structure contains additional information to uniquely identify a given wrapper
  * method. It can be retrieved by mono_marshal_get_wrapper_info () for certain types
@@ -231,6 +235,8 @@ typedef struct {
                RemotingWrapperInfo remoting;
                /* GSHAREDVT_IN_SIG/GSHAREDVT_OUT_SIG */
                GsharedvtWrapperInfo gsharedvt;
+               /* DELEGATE_INVOKE */
+               DelegateInvokeWrapperInfo delegate_invoke;
        } d;
 } WrapperInfo;
 
index 2f818c6821cef511e12f349739f013f8de8e7116..34fbdda6e078b66252696371c1bd626ff3589f60 100644 (file)
@@ -4041,7 +4041,7 @@ find_aot_method_in_amodule (MonoAotModule *amodule, MonoMethod *method, guint32
                        WrapperInfo *info1 = mono_marshal_get_wrapper_info (method);
                        WrapperInfo *info2 = mono_marshal_get_wrapper_info (m);
 
-                       if (info1 && info2 && info1->subtype == info2->subtype && method->klass == m->klass) {
+                       if (info1 && info2 && info1->subtype == info2->subtype && info1->d.delegate_invoke.method == info2->d.delegate_invoke.method) {
                                index = value;
                                break;
                        }