Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 67 additions & 30 deletions mono/mini/interp/interp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1758,7 +1758,7 @@ interp_entry (InterpEntryData *data)
}

static MONO_NEVER_INLINE stackval *
do_icall (ThreadContext *context, int op, stackval *sp, gpointer ptr)
do_icall (ThreadContext *context, MonoMethodSignature *sig, int op, stackval *sp, gpointer ptr)
{
MonoLMFExt ext;
interp_push_lmf (&ext, context->current_frame);
Expand Down Expand Up @@ -1792,52 +1792,68 @@ do_icall (ThreadContext *context, int op, stackval *sp, gpointer ptr)
func (sp [0].data.p, sp [1].data.p);
break;
}
case MINT_ICALL_PI_V: {
void (*func)(gpointer,int) = ptr;
sp -= 2;
func (sp [0].data.p, sp [1].data.i);
break;
}
case MINT_ICALL_PP_P: {
gpointer (*func)(gpointer,gpointer) = ptr;
--sp;
sp [-1].data.p = func (sp [-1].data.p, sp [0].data.p);
break;
}
case MINT_ICALL_PI_P: {
gpointer (*func)(gpointer,int) = ptr;
--sp;
sp [-1].data.p = func (sp [-1].data.p, sp [0].data.i);
break;
}
case MINT_ICALL_PPP_V: {
void (*func)(gpointer,gpointer,gpointer) = ptr;
sp -= 3;
func (sp [0].data.p, sp [1].data.p, sp [2].data.p);
break;
}
case MINT_ICALL_PPI_V: {
void (*func)(gpointer,gpointer,int) = ptr;
case MINT_ICALL_PPP_P: {
gpointer (*func)(gpointer,gpointer,gpointer) = ptr;
sp -= 2;
sp [-1].data.p = func (sp [-1].data.p, sp [0].data.p, sp [1].data.p);
break;
}
case MINT_ICALL_PPPP_V: {
void (*func)(gpointer,gpointer,gpointer,gpointer) = ptr;
sp -= 4;
func (sp [0].data.p, sp [1].data.p, sp [2].data.p, sp [3].data.p);
break;
}
case MINT_ICALL_PPPP_P: {
gpointer (*func)(gpointer,gpointer,gpointer,gpointer) = ptr;
sp -= 3;
func (sp [0].data.p, sp [1].data.p, sp [2].data.i);
sp [-1].data.p = func (sp [-1].data.p, sp [0].data.p, sp [1].data.p, sp [2].data.p);
break;
}
case MINT_ICALL_PII_P: {
gpointer (*func)(gpointer,int,int) = ptr;
sp -= 2;
sp [-1].data.p = func (sp [-1].data.p, sp [0].data.i, sp [1].data.i);
case MINT_ICALL_PPPPP_V: {
void (*func)(gpointer,gpointer,gpointer,gpointer,gpointer) = ptr;
sp -= 5;
func (sp [0].data.p, sp [1].data.p, sp [2].data.p, sp [3].data.p, sp [4].data.p);
break;
}
case MINT_ICALL_PPII_V: {
gpointer (*func)(gpointer,gpointer,int,int) = ptr;
case MINT_ICALL_PPPPP_P: {
gpointer (*func)(gpointer,gpointer,gpointer,gpointer,gpointer) = ptr;
sp -= 4;
func (sp [0].data.p, sp [1].data.p, sp [2].data.i, sp [3].data.i);
sp [-1].data.p = func (sp [-1].data.p, sp [0].data.p, sp [1].data.p, sp [2].data.p, sp [3].data.p);
break;
}
case MINT_ICALL_PPPPPP_V: {
void (*func)(gpointer,gpointer,gpointer,gpointer,gpointer,gpointer) = ptr;
sp -= 6;
func (sp [0].data.p, sp [1].data.p, sp [2].data.p, sp [3].data.p, sp [4].data.p, sp [5].data.p);
break;
}
case MINT_ICALL_PPPPPP_P: {
gpointer (*func)(gpointer,gpointer,gpointer,gpointer,gpointer,gpointer) = ptr;
sp -= 5;
sp [-1].data.p = func (sp [-1].data.p, sp [0].data.p, sp [1].data.p, sp [2].data.p, sp [3].data.p, sp [4].data.p);
break;
}
default:
g_assert_not_reached ();
}

/* convert the native representation to the stackval representation */
if (sig)
stackval_from_data (sig->ret, &sp [-1], (char*) &sp [-1].data.p, sig->pinvoke);

interp_pop_lmf (&ext);
return sp;
}
Expand Down Expand Up @@ -2833,6 +2849,25 @@ interp_exec_method_full (InterpFrame *frame, ThreadContext *context, guint16 *st
}
MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_CALLI_NAT_FAST) {
gpointer target_ip = sp [-1].data.p;
MonoMethodSignature *csignature = rtm->data_items [* (guint16 *)(ip + 1)];
int opcode = *(guint16 *)(ip + 2);

sp--;
frame->ip = ip;

sp = do_icall (context, csignature, opcode, sp, target_ip);
EXCEPTION_CHECKPOINT;
if (context->has_resume_state) {
if (frame == context->handler_frame)
SET_RESUME_STATE (context);
else
goto exit_frame;
}
ip += 3;
MINT_IN_BREAK;
}
MINT_IN_CASE(MINT_CALLI_NAT) {
MonoMethodSignature *csignature;
stackval *endsp = sp;
Expand Down Expand Up @@ -4859,7 +4894,7 @@ interp_exec_method_full (InterpFrame *frame, ThreadContext *context, guint16 *st
* dummy frame that is stored in the lmf and serves as the transition frame
*/
context->current_frame = &child_frame;
do_icall (context, MINT_ICALL_V_P, &tmp_sp, mono_thread_get_undeniable_exception);
do_icall (context, NULL, MINT_ICALL_V_P, &tmp_sp, mono_thread_get_undeniable_exception);
context->current_frame = frame;

MonoException *abort_exc = (MonoException*)tmp_sp.data.p;
Expand All @@ -4880,15 +4915,17 @@ interp_exec_method_full (InterpFrame *frame, ThreadContext *context, guint16 *st
MINT_IN_CASE(MINT_ICALL_P_V)
MINT_IN_CASE(MINT_ICALL_P_P)
MINT_IN_CASE(MINT_ICALL_PP_V)
MINT_IN_CASE(MINT_ICALL_PI_V)
MINT_IN_CASE(MINT_ICALL_PP_P)
MINT_IN_CASE(MINT_ICALL_PI_P)
MINT_IN_CASE(MINT_ICALL_PPP_V)
MINT_IN_CASE(MINT_ICALL_PPI_V)
MINT_IN_CASE(MINT_ICALL_PII_P)
MINT_IN_CASE(MINT_ICALL_PPII_V)
MINT_IN_CASE(MINT_ICALL_PPP_P)
MINT_IN_CASE(MINT_ICALL_PPPP_V)
MINT_IN_CASE(MINT_ICALL_PPPP_P)
MINT_IN_CASE(MINT_ICALL_PPPPP_V)
MINT_IN_CASE(MINT_ICALL_PPPPP_P)
MINT_IN_CASE(MINT_ICALL_PPPPPP_V)
MINT_IN_CASE(MINT_ICALL_PPPPPP_P)
frame->ip = ip;
sp = do_icall (context, *ip, sp, rtm->data_items [*(guint16 *)(ip + 1)]);
sp = do_icall (context, NULL, *ip, sp, rtm->data_items [*(guint16 *)(ip + 1)]);
EXCEPTION_CHECKPOINT;
if (context->has_resume_state) {
if (frame == context->handler_frame)
Expand Down
15 changes: 9 additions & 6 deletions mono/mini/interp/mintops.def
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,8 @@ OPDEF(MINT_VCALL, "vcall", 2, MintOpMethodToken)
OPDEF(MINT_CALLVIRT, "callvirt", 2, MintOpMethodToken)
OPDEF(MINT_VCALLVIRT, "vcallvirt", 2, MintOpMethodToken)
OPDEF(MINT_CALLI, "calli", 2, MintOpMethodToken)
OPDEF(MINT_CALLI_NAT, "calli.nat", 2, MintOpMethodToken)
OPDEF(MINT_CALLI_NAT, "calli.nat", 3, MintOpMethodToken)
OPDEF(MINT_CALLI_NAT_FAST, "calli.nat", 2, MintOpMethodToken)
OPDEF(MINT_JMP, "jmp", 2, MintOpMethodToken)

OPDEF(MINT_CALLRUN, "callrun", 3, MintOpNoArgs)
Expand Down Expand Up @@ -539,13 +540,15 @@ OPDEF(MINT_ICALL_V_P, "mono_icall_v_p", 2, MintOpClassToken)
OPDEF(MINT_ICALL_P_V, "mono_icall_p_v", 2, MintOpClassToken)
OPDEF(MINT_ICALL_P_P, "mono_icall_p_p", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PP_V, "mono_icall_pp_v", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PI_V, "mono_icall_pi_v", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PP_P, "mono_icall_pp_p", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PI_P, "mono_icall_pi_p", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PPP_V, "mono_icall_ppp_v", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PPI_V, "mono_icall_ppi_v", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PII_P, "mono_icall_pii_p", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PPII_V, "mono_icall_ppii_v", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PPP_P, "mono_icall_ppp_p", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PPPP_V, "mono_icall_pppp_v", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PPPP_P, "mono_icall_pppp_p", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PPPPP_V, "mono_icall_ppppp_v", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PPPPP_P, "mono_icall_ppppp_p", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PPPPPP_V, "mono_icall_pppppp_v", 2, MintOpClassToken)
OPDEF(MINT_ICALL_PPPPPP_P, "mono_icall_pppppp_p", 2, MintOpClassToken)
OPDEF(MINT_MONO_LDPTR, "mono_ldptr", 2, MintOpClassToken)
OPDEF(MINT_MONO_TLS, "mono_tls", 3, MintOpInt)
OPDEF(MINT_MONO_NEWOBJ, "mono_newobj", 2, MintOpClassToken)
Expand Down
Loading