}
if (!unwinder->in_interp)
- return unwinder_unwind_frame (unwinder, jit_tls, prev_ji, ctx, new_ctx, trace, lmf, save_locations, frame);
+ frame->type = FRAME_TYPE_INTERP_ENTRY;
return TRUE;
} else {
gboolean res = mono_find_jit_info_ext (jit_tls, prev_ji, ctx, new_ctx, trace, lmf,
case FRAME_TYPE_TRAMPOLINE:
case FRAME_TYPE_INTERP_TO_MANAGED:
case FRAME_TYPE_INTERP_TO_MANAGED_WITH_CTX:
+ case FRAME_TYPE_INTERP_ENTRY:
continue;
case FRAME_TYPE_INTERP:
case FRAME_TYPE_MANAGED:
case FRAME_TYPE_INTERP_TO_MANAGED_WITH_CTX:
*ctx = new_ctx;
continue;
+ case FRAME_TYPE_INTERP_ENTRY:
+ if (mono_aot_mode == MONO_AOT_MODE_LLVMONLY_INTERP)
+ /*
+ * There might be AOTed frames above the intepreted frames which can handle the exception,
+ * so stop first pass, the caller will rethrow the exception, starting the process again.
+ */
+ return MONO_FIRST_PASS_UNHANDLED;
+ *ctx = new_ctx;
+ continue;
case FRAME_TYPE_INTERP:
case FRAME_TYPE_MANAGED:
break;
case FRAME_TYPE_MANAGED_TO_NATIVE:
case FRAME_TYPE_TRAMPOLINE:
case FRAME_TYPE_INTERP_TO_MANAGED_WITH_CTX:
+ case FRAME_TYPE_INTERP_ENTRY:
*ctx = new_ctx;
continue;
case FRAME_TYPE_INTERP_TO_MANAGED:
FRAME_TYPE_INTERP_TO_MANAGED = 5,
/* same, but with MonoContext */
FRAME_TYPE_INTERP_TO_MANAGED_WITH_CTX = 6,
- FRAME_TYPE_NUM = 7
+ /* Frame for transitioning to interpreted code */
+ FRAME_TYPE_INTERP_ENTRY = 7,
+ FRAME_TYPE_NUM = 8
} MonoStackFrameType;
typedef enum {