From c2b0ab38a614f9cc54754b38aab94e54880f0e34 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Tue, 3 May 2022 02:20:39 -0400 Subject: [PATCH] [mono][wasm] Pin corlib exceptions after creation. Fixes https://github.com/dotnet/runtime/issues/63749. --- src/mono/mono/mini/mini-exceptions.c | 32 ++++++++++++++++------------ 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/mono/mono/mini/mini-exceptions.c b/src/mono/mono/mini/mini-exceptions.c index f6ce3463d32ef8..fa7bab55a393fc 100644 --- a/src/mono/mono/mini/mini-exceptions.c +++ b/src/mono/mono/mini/mini-exceptions.c @@ -3413,7 +3413,7 @@ mono_install_ftnptr_eh_callback (MonoFtnPtrEHCallback callback) */ static void -throw_exception (MonoObject *ex, gboolean rethrow) +llvmonly_setup_exception (MonoObject *ex, gboolean rethrow) { MONO_REQ_GC_UNSAFE_MODE; @@ -3430,8 +3430,11 @@ throw_exception (MonoObject *ex, gboolean rethrow) else mono_ex = (MonoException*)ex; - // Note: Not pinned - jit_tls->thrown_exc = mono_gchandle_new_internal ((MonoObject*)mono_ex, FALSE); + if (jit_tls->thrown_exc) + /* Already set in mini_llvmonly_throw_corlib_exception () */ + mono_gchandle_set_target (jit_tls->thrown_exc, (MonoObject*)mono_ex); + else + jit_tls->thrown_exc = mono_gchandle_new_internal ((MonoObject*)mono_ex, TRUE); if (!rethrow) { #ifdef MONO_ARCH_HAVE_UNWIND_BACKTRACE @@ -3454,15 +3457,6 @@ throw_exception (MonoObject *ex, gboolean rethrow) g_list_free (trace); #endif } - - if (rethrow) { - MonoContext ctx; - MonoJitInfo *out_ji; - memset (&ctx, 0, sizeof (MonoContext)); - - mono_handle_exception_internal (&ctx, ex, FALSE, &out_ji); - mono_llvm_cpp_throw_exception (); - } } void @@ -3482,7 +3476,7 @@ mini_llvmonly_throw_exception (MonoObject *ex) mono_handle_exception (&ctx, (MonoObject*)ex); - throw_exception (ex, FALSE); + llvmonly_setup_exception (ex, FALSE); /* Unwind back to either an AOTed frame or to the interpreter */ mono_llvm_cpp_throw_exception (); @@ -3491,16 +3485,26 @@ mini_llvmonly_throw_exception (MonoObject *ex) void mini_llvmonly_rethrow_exception (MonoObject *ex) { - throw_exception (ex, TRUE); + llvmonly_setup_exception (ex, TRUE); + + MonoContext ctx; + MonoJitInfo *out_ji; + memset (&ctx, 0, sizeof (MonoContext)); + + mono_handle_exception_internal (&ctx, ex, FALSE, &out_ji); + + mono_llvm_cpp_throw_exception (); } void mini_llvmonly_throw_corlib_exception (guint32 ex_token_index) { guint32 ex_token = MONO_TOKEN_TYPE_DEF | ex_token_index; + MonoJitTlsData *jit_tls = mono_get_jit_tls (); MonoException *ex; ex = mono_exception_from_token (m_class_get_image (mono_defaults.exception_class), ex_token); + jit_tls->thrown_exc = mono_gchandle_new_internal ((MonoObject*)ex, FALSE); mini_llvmonly_throw_exception ((MonoObject*)ex); }