From 13c1e65a9f7aab201fe77e3daba11946aeb7cbaa Mon Sep 17 00:00:00 2001 From: monojenkins Date: Tue, 18 Feb 2020 13:59:27 -0500 Subject: [PATCH] [interp] Unwrap RuntimeWrappedException if needed (#32485) when throwing non exception objects. Enable the entire System.Linq.Expressions suite with interpreter Co-authored-by: Vlad Brezae --- src/mono/mono/mini/ee.h | 2 +- src/mono/mono/mini/interp-stubs.c | 2 +- src/mono/mono/mini/interp/interp.c | 4 ++-- src/mono/mono/mini/mini-exceptions.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mono/mono/mini/ee.h b/src/mono/mono/mini/ee.h index 1eb31f32245da..1b1bd5acacd41 100644 --- a/src/mono/mono/mini/ee.h +++ b/src/mono/mono/mini/ee.h @@ -36,7 +36,7 @@ typedef gpointer MonoInterpFrameHandle; MONO_EE_CALLBACK (void, init_delegate, (MonoDelegate *del, MonoError *error)) \ MONO_EE_CALLBACK (void, delegate_ctor, (MonoObjectHandle this_obj, MonoObjectHandle target, gpointer addr, MonoError *error)) \ MONO_EE_CALLBACK (gpointer, get_remoting_invoke, (MonoMethod *method, gpointer imethod, MonoError *error)) \ - MONO_EE_CALLBACK (void, set_resume_state, (MonoJitTlsData *jit_tls, MonoException *ex, MonoJitExceptionInfo *ei, MonoInterpFrameHandle interp_frame, gpointer handler_ip)) \ + MONO_EE_CALLBACK (void, set_resume_state, (MonoJitTlsData *jit_tls, MonoObject *ex, MonoJitExceptionInfo *ei, MonoInterpFrameHandle interp_frame, gpointer handler_ip)) \ MONO_EE_CALLBACK (void, get_resume_state, (const MonoJitTlsData *jit_tls, gboolean *has_resume_state, MonoInterpFrameHandle *interp_frame, gpointer *handler_ip)) \ MONO_EE_CALLBACK (gboolean, run_finally, (StackFrameInfo *frame, int clause_index, gpointer handler_ip, gpointer handler_ip_end)) \ MONO_EE_CALLBACK (gboolean, run_filter, (StackFrameInfo *frame, MonoException *ex, int clause_index, gpointer handler_ip, gpointer handler_ip_end)) \ diff --git a/src/mono/mono/mini/interp-stubs.c b/src/mono/mono/mini/interp-stubs.c index 042ab6005ac30..233dda124a9dd 100644 --- a/src/mono/mono/mini/interp-stubs.c +++ b/src/mono/mono/mini/interp-stubs.c @@ -104,7 +104,7 @@ stub_cleanup (void) } static void -stub_set_resume_state (MonoJitTlsData *jit_tls, MonoException *ex, MonoJitExceptionInfo *ei, MonoInterpFrameHandle interp_frame, gpointer handler_ip) +stub_set_resume_state (MonoJitTlsData *jit_tls, MonoObject *ex, MonoJitExceptionInfo *ei, MonoInterpFrameHandle interp_frame, gpointer handler_ip) { g_assert_not_reached (); } diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index b558b672eae83..ed6d780bc58d0 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -7189,7 +7189,7 @@ interp_parse_options (const char *options) * Set the state the interpeter will continue to execute from after execution returns to the interpreter. */ static void -interp_set_resume_state (MonoJitTlsData *jit_tls, MonoException *ex, MonoJitExceptionInfo *ei, MonoInterpFrameHandle interp_frame, gpointer handler_ip) +interp_set_resume_state (MonoJitTlsData *jit_tls, MonoObject *ex, MonoJitExceptionInfo *ei, MonoInterpFrameHandle interp_frame, gpointer handler_ip) { ThreadContext *context; @@ -7205,7 +7205,7 @@ interp_set_resume_state (MonoJitTlsData *jit_tls, MonoException *ex, MonoJitExce context->exc_gchandle = mono_gchandle_new_internal ((MonoObject*)ex, FALSE); /* Ditto */ if (ei) - *(MonoException**)(frame_locals (context->handler_frame) + ei->exvar_offset) = ex; + *(MonoObject**)(frame_locals (context->handler_frame) + ei->exvar_offset) = ex; context->handler_ip = (const guint16*)handler_ip; } diff --git a/src/mono/mono/mini/mini-exceptions.c b/src/mono/mono/mini/mini-exceptions.c index f000d579a45e1..993fe25c40f87 100644 --- a/src/mono/mono/mini/mini-exceptions.c +++ b/src/mono/mono/mini/mini-exceptions.c @@ -2941,7 +2941,7 @@ mono_handle_exception_internal (MonoContext *ctx, MonoObject *obj, gboolean resu * like the call which transitioned to JITted code has succeeded, but the * return value register etc. is not set, so we have to be careful. */ - mini_get_interp_callbacks ()->set_resume_state (jit_tls, mono_ex, ei, frame.interp_frame, ei->handler_start); + mini_get_interp_callbacks ()->set_resume_state (jit_tls, ex_obj, ei, frame.interp_frame, ei->handler_start); /* Undo the IP adjustment done by mono_arch_unwind_frame () */ /* ip == 0 means an interpreter frame */ if (MONO_CONTEXT_GET_IP (ctx) != 0)