[mono][wasm] Fix support for virtual invokes. (#86687)
authorZoltan Varga <vargaz@gmail.com>
Wed, 24 May 2023 08:20:03 +0000 (04:20 -0400)
committerGitHub <noreply@github.com>
Wed, 24 May 2023 08:20:03 +0000 (04:20 -0400)
Fixes https://github.com/dotnet/runtime/issues/86621.

src/mono/mono/mini/method-to-ir.c
src/mono/mono/mini/mini-runtime.c

index 32e2bf0..7c0ebbb 100644 (file)
@@ -7528,7 +7528,10 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                                        goto calli_end;
                                }
                        }
-                       if (cfg->llvm_only && !(cfg->method->wrapper_type && cfg->method->wrapper_type != MONO_WRAPPER_DYNAMIC_METHOD))
+                       /* Some wrappers use calli with ftndesc-es */
+                       if (cfg->llvm_only && !(cfg->method->wrapper_type &&
+                                                                       cfg->method->wrapper_type != MONO_WRAPPER_DYNAMIC_METHOD &&
+                                                                       cfg->method->wrapper_type != MONO_WRAPPER_DELEGATE_INVOKE))
                                ins = mini_emit_llvmonly_calli (cfg, fsig, sp, addr);
                        else
                                ins = (MonoInst*)mini_emit_calli_full (cfg, fsig, sp, addr, NULL, NULL, tailcall);
index 094da4f..019fc1a 100644 (file)
@@ -2920,7 +2920,7 @@ get_ftnptr_for_method (MonoMethod *method, gboolean need_unbox, MonoError *error
                res = mini_add_method_trampoline (method, res, mono_method_needs_static_rgctx_invoke (method, TRUE), need_unbox);
                return res;
        } else {
-               return mini_llvmonly_load_method_ftndesc (method, FALSE, FALSE, error);
+               return mini_llvmonly_load_method_ftndesc (method, FALSE, need_unbox, error);
        }
 }