From cc108cbfe082bdfd7172a4a009b6405ddff7efaa Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Tue, 14 Aug 2018 14:55:43 +0300 Subject: [PATCH] [interp] Restore frame ip after running finally handler EH still uses the original ip for determining whether there are any abort protected blocks to be exited, once the frame is unwinded. Fixes delegate2.exe --- mono/mini/interp/interp.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mono/mini/interp/interp.c b/mono/mini/interp/interp.c index 7b40d92ae0f..23193ec8628 100644 --- a/mono/mini/interp/interp.c +++ b/mono/mini/interp/interp.c @@ -5705,12 +5705,16 @@ interp_run_finally (StackFrameInfo *frame, int clause_index, gpointer handler_ip { InterpFrame *iframe = (InterpFrame*)frame->interp_frame; ThreadContext *context = (ThreadContext*)mono_native_tls_get_value (thread_context_id); + const unsigned short *old_ip = iframe->ip; + interp_exec_method_full (iframe, context, (guint16*)handler_ip, NULL, clause_index, NULL); - if (context->has_resume_state) + if (context->has_resume_state) { return TRUE; - else + } else { + iframe->ip = old_ip; return FALSE; + } } /* -- 2.11.4.GIT