++ip;
sp[-1].data.l = *(gint64*)sp[-1].data.p;
MINT_IN_BREAK;
- MINT_IN_CASE(MINT_LDIND_I)
- ++ip;
- sp[-1].data.p = *(gpointer*)sp[-1].data.p;
+ MINT_IN_CASE(MINT_LDIND_I) {
+ guint16 offset = * (guint16 *)(ip + 1);
+ sp[-1 - offset].data.p = *(gpointer*)sp[-1 - offset].data.p;
+ ip += 2;
MINT_IN_BREAK;
+ }
MINT_IN_CASE(MINT_LDIND_R4)
++ip;
sp[-1].data.f = *(gfloat*)sp[-1].data.p;
sp [-1].data.i = (mono_u)sp [-1].data.l;
++ip;
MINT_IN_BREAK;
- MINT_IN_CASE(MINT_BOX)
+ MINT_IN_CASE(MINT_BOX) {
c = rtm->data_items [* (guint16 *)(ip + 1)];
+ guint16 offset = * (guint16 *)(ip + 2);
if (c->byval_arg.type == MONO_TYPE_VALUETYPE && !c->enumtype) {
int size = mono_class_value_size (c, NULL);
- sp [-1].data.p = mono_value_box_checked (context->domain, c, sp [-1].data.p, &error);
+ sp [-1 - offset].data.p = mono_value_box_checked (context->domain, c, sp [-1 - offset].data.p, &error);
mono_error_cleanup (&error); /* FIXME: don't swallow the error */
size = (size + 7) & ~7;
vt_sp -= size;
- }
- else {
- stackval_to_data (&c->byval_arg, &sp [-1], (char*)&sp [-1], FALSE);
- sp [-1].data.p = mono_value_box_checked (context->domain, c, &sp [-1], &error);
+ } else {
+ stackval_to_data (&c->byval_arg, &sp [-1 - offset], (char *) &sp [-1 - offset], FALSE);
+ sp [-1 - offset].data.p = mono_value_box_checked (context->domain, c, &sp [-1 - offset], &error);
mono_error_cleanup (&error); /* FIXME: don't swallow the error */
}
- ip += 2;
+ ip += 3;
MINT_IN_BREAK;
+ }
MINT_IN_CASE(MINT_NEWARR)
sp [-1].data.p = (MonoObject*) mono_array_new_checked (context->domain, rtm->data_items[*(guint16 *)(ip + 1)], sp [-1].data.i, &error);
mono_error_cleanup (&error); /* FIXME: don't swallow the error */
OPDEF(MINT_LDIND_I4, "ldind.i4", 1, MintOpNoArgs)
OPDEF(MINT_LDIND_U4, "ldind.u4", 1, MintOpNoArgs)
OPDEF(MINT_LDIND_I8, "ldind.i8", 1, MintOpNoArgs)
-OPDEF(MINT_LDIND_I, "ldind.i", 1, MintOpNoArgs)
+OPDEF(MINT_LDIND_I, "ldind.i", 2, MintOpUShortInt)
OPDEF(MINT_LDIND_R4, "ldind.r4", 1, MintOpNoArgs)
OPDEF(MINT_LDIND_R8, "ldind.r8", 1, MintOpNoArgs)
OPDEF(MINT_LDIND_REF, "ldind.ref", 1, MintOpNoArgs)
OPDEF(MINT_CASTCLASS, "castclass", 2, MintOpClassToken)
OPDEF(MINT_ISINST, "isinst", 2, MintOpClassToken)
OPDEF(MINT_NEWARR, "newarr", 2, MintOpClassToken)
-OPDEF(MINT_BOX, "box", 2, MintOpClassToken)
+OPDEF(MINT_BOX, "box", 3, MintOpTwoShorts)
OPDEF(MINT_UNBOX, "unbox", 2, MintOpClassToken)
OPDEF(MINT_LDTOKEN, "ldtoken", 2, MintOpClassToken) /* not really */
OPDEF(MINT_LDFTN, "ldftn", 2, MintOpMethodToken)
case CEE_LDIND_I:
CHECK_STACK (&td, 1);
SIMPLE_OP (td, MINT_LDIND_I);
+ ADD_CODE (&td, 0);
SET_SIMPLE_TYPE(td.sp - 1, STACK_TYPE_I);
break;
case CEE_LDIND_R4:
}
ADD_CODE(&td, MINT_BOX);
ADD_CODE(&td, get_data_item_index (&td, klass));
+ ADD_CODE (&td, 0);
SET_TYPE(td.sp - 1, STACK_TYPE_O, klass);
td.ip += 5;
}