sp->data.datamem = (argtype) frame->stack_args [ip [1]].data.datamem; \
ip += 2; \
++sp;
+
+#define LDARGn(datamem, argtype, n) \
+ sp->data.datamem = (argtype) frame->stack_args [n].data.datamem; \
+ ++ip; \
+ ++sp;
MINT_IN_CASE(MINT_LDARG_I1) LDARG(i, gint8); MINT_IN_BREAK;
MINT_IN_CASE(MINT_LDARG_U1) LDARG(i, guint8); MINT_IN_BREAK;
MINT_IN_CASE(MINT_LDARG_O) LDARG(p, gpointer); MINT_IN_BREAK;
MINT_IN_CASE(MINT_LDARG_P) LDARG(p, gpointer); MINT_IN_BREAK;
+ MINT_IN_CASE(MINT_LDARG_P0) LDARGn(p, gpointer, 0); MINT_IN_BREAK;
+
MINT_IN_CASE(MINT_LDARG_VT) {
sp->data.p = vt_sp;
int const i32 = READ32 (ip + 2);
OPDEF(MINT_LDARG_R8, "ldarg.r8", 2, Pop0, Push1, MintOpUShortInt)
OPDEF(MINT_LDARG_O, "ldarg.o", 2, Pop0, Push1, MintOpUShortInt)
OPDEF(MINT_LDARG_P, "ldarg.p", 2, Pop0, Push1, MintOpUShortInt)
+OPDEF(MINT_LDARG_P0, "ldarg.p0", 1, Pop0, Push1, MintOpNoArgs)\r
OPDEF(MINT_LDARG_VT, "ldarg.vt", 4, Pop0, Push1, MintOpShortAndInt)
OPDEF(MINT_STARG_I1, "starg.i1", 2, Pop1, Push0, MintOpUShortInt)
if (hasthis && n == 0) {
mt = MINT_TYPE_P;
- interp_add_ins (td, MINT_LDARG_P);
- td->last_ins->data [0] = 0;
+ interp_add_ins (td, MINT_LDARG_P0);
klass = NULL;
} else {
PUSH_VT (td, size);
WRITE32_INS (td->last_ins, 1, &size);
}
} else {
- if (hasthis && n == 0) {
+ if ((hasthis || mt == MINT_TYPE_P) && n == 0) {
mt = MINT_TYPE_P;
- interp_add_ins (td, MINT_LDARG_P);
- td->last_ins->data [0] = n;
- klass = NULL;
+ interp_add_ins (td, MINT_LDARG_P0);
} else {
interp_add_ins (td, MINT_LDARG_I1 + (mt - MINT_TYPE_I1));
td->last_ins->data [0] = n;