[interp] Unwrap RuntimeWrappedException if needed (#32485)
authormonojenkins <jo.shields+jenkins@xamarin.com>
Tue, 18 Feb 2020 18:59:27 +0000 (13:59 -0500)
committerGitHub <noreply@github.com>
Tue, 18 Feb 2020 18:59:27 +0000 (19:59 +0100)
when throwing non exception objects.

Enable the entire System.Linq.Expressions suite with interpreter

Co-authored-by: Vlad Brezae <brezaevlad@gmail.com>
src/mono/mono/mini/ee.h
src/mono/mono/mini/interp-stubs.c
src/mono/mono/mini/interp/interp.c
src/mono/mono/mini/mini-exceptions.c

index 1eb31f3..1b1bd5a 100644 (file)
@@ -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)) \
index 042ab60..233dda1 100644 (file)
@@ -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 ();
 }
index b558b67..ed6d780 100644 (file)
@@ -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;
 }
 
index f000d57..993fe25 100644 (file)
@@ -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)