MINT_IN_CASE(MINT_LDELEM_I) /* fall through */
MINT_IN_CASE(MINT_LDELEM_R4) /* fall through */
MINT_IN_CASE(MINT_LDELEM_R8) /* fall through */
- MINT_IN_CASE(MINT_LDELEM_REF) {
+ MINT_IN_CASE(MINT_LDELEM_REF) /* fall through */
+ MINT_IN_CASE(MINT_LDELEM_VT) {
MonoArray *o;
mono_u aindex;
case MINT_LDELEM_REF:
sp [0].data.p = mono_array_get (o, gpointer, aindex);
break;
+ case MINT_LDELEM_VT: {
+ MonoClass *klass_vt = rtm->data_items [*(guint16 *) (ip + 1)];
+ i32 = READ32 (ip + 2);
+ char *src_addr = mono_array_addr_with_size ((MonoArray *) o, i32, aindex);
+ sp [0].data.vt = vt_sp;
+ stackval_from_data (&klass_vt->byval_arg, sp, src_addr, FALSE);
+ vt_sp += (i32 + 7) & ~7;
+ ip += 3;
+ break;
+ }
default:
ves_abort();
}
MINT_IN_CASE(MINT_STELEM_I8) /* fall through */
MINT_IN_CASE(MINT_STELEM_R4) /* fall through */
MINT_IN_CASE(MINT_STELEM_R8) /* fall through */
- MINT_IN_CASE(MINT_STELEM_REF) {
+ MINT_IN_CASE(MINT_STELEM_REF) /* fall through */
+ MINT_IN_CASE(MINT_STELEM_VT) {
mono_u aindex;
sp -= 3;
if (sp [2].data.p && !isinst_obj)
THROW_EX (mono_get_exception_array_type_mismatch (), ip);
mono_array_set ((MonoArray *)o, gpointer, aindex, sp [2].data.p);
- } break;
+ break;
+ }
+ case MINT_STELEM_VT: {
+ MonoClass *klass_vt = rtm->data_items [*(guint16 *) (ip + 1)];
+ i32 = READ32 (ip + 2);
+ char *dst_addr = mono_array_addr_with_size ((MonoArray *) o, i32, aindex);
+
+ stackval_to_data (&klass_vt->byval_arg, &sp [2], dst_addr, FALSE);
+ vt_sp -= (i32 + 7) & ~7;
+ ip += 3;
+ break;
+ }
default:
ves_abort();
}
OPDEF(MINT_LDELEM_R4, "ldelem.r4", 1, MintOpNoArgs)
OPDEF(MINT_LDELEM_R8, "ldelem.r8", 1, MintOpNoArgs)
OPDEF(MINT_LDELEM_REF, "ldelem.ref", 1, MintOpNoArgs)
+OPDEF(MINT_LDELEM_VT, "ldelem.vt", 4, MintOpShortAndInt)
OPDEF(MINT_LDELEMA, "ldelema", 2, MintOpClassToken)
OPDEF(MINT_STELEM_R4, "stelem.r4", 1, MintOpNoArgs)
OPDEF(MINT_STELEM_R8, "stelem.r8", 1, MintOpNoArgs)
OPDEF(MINT_STELEM_REF, "stelem.ref", 1, MintOpNoArgs)
+OPDEF(MINT_STELEM_VT, "stelem.vt", 4, MintOpShortAndInt)
OPDEF(MINT_LDLEN, "ldlen", 1, MintOpNoArgs)
--td.sp;
SET_SIMPLE_TYPE(td.sp - 1, STACK_TYPE_I4);
break;
+ case MINT_TYPE_VT: {
+ int size = mono_class_value_size (klass, NULL);
+ ENSURE_I4 (&td, 1);
+ SIMPLE_OP (td, MINT_LDELEM_VT);
+ ADD_CODE (&td, get_data_item_index (&td, klass));
+ WRITE32 (&td, &size);
+ --td.sp;
+ SET_SIMPLE_TYPE(td.sp - 1, STACK_TYPE_VT);
+ PUSH_VT (&td, size);
+ break;
+ }
default: {
GString *res = g_string_new ("");
mono_type_get_desc (res, &klass->byval_arg, TRUE);
case MINT_TYPE_I4:
SIMPLE_OP (td, MINT_STELEM_I4);
break;
+ case MINT_TYPE_O:
+ SIMPLE_OP (td, MINT_STELEM_REF);
+ break;
+ case MINT_TYPE_VT: {
+ int size = mono_class_value_size (klass, NULL);
+ SIMPLE_OP (td, MINT_STELEM_VT);
+ ADD_CODE (&td, get_data_item_index (&td, klass));
+ WRITE32 (&td, &size);
+ POP_VT (&td, size);
+ break;
+ }
default: {
GString *res = g_string_new ("");
mono_type_get_desc (res, &klass->byval_arg, TRUE);