From 103c7b04da00e21d9718c00ea60d82e895c7eeaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tautvydas=20=C5=BDilys?= Date: Wed, 21 Feb 2024 20:13:07 -0800 Subject: [PATCH] Fix marshaling/interop code emitting ldloc 65535 instruction when calling method on a COM interface. This happened due to unitialized local variable (gc_safe_transition_builder.coop_cominterop_fnptr) getting loaded when "need_gc_safe" is false. This caused the JIT to throw an InvalidOperationException (case UUM-62035). --- mono/metadata/marshal-ilgen.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mono/metadata/marshal-ilgen.c b/mono/metadata/marshal-ilgen.c index 31e2522683b7..393bb509061e 100644 --- a/mono/metadata/marshal-ilgen.c +++ b/mono/metadata/marshal-ilgen.c @@ -2156,7 +2156,12 @@ emit_native_wrapper_ilgen (MonoImage *image, MonoMethodBuilder *mb, MonoMethodSi mono_mb_emit_calli (mb, csig); } else if (MONO_CLASS_IS_IMPORT (mb->method->klass)) { #ifndef DISABLE_COM - mono_mb_emit_ldloc (mb, gc_safe_transition_builder.coop_cominterop_fnptr); + if (need_gc_safe) { + mono_mb_emit_ldloc (mb, gc_safe_transition_builder.coop_cominterop_fnptr); + } else { + mono_mb_emit_cominterop_get_function_pointer (mb, &piinfo->method); + } + if (piinfo->piflags & PINVOKE_ATTRIBUTE_SUPPORTS_LAST_ERROR) { mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); mono_mb_emit_byte (mb, CEE_MONO_SAVE_LAST_ERROR);