}
}
- if (method->klass->valuetype && obj)
- /* Unbox the instance, since valuetype methods expect an interior pointer. */
- obj = mono_object_unbox (obj);
-
if (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL)
method = mono_marshal_get_native_wrapper (method);
INIT_FRAME(&frame,context->current_frame,obj,args,&result,method);
++sp;
++ip;
MINT_IN_BREAK;
+ MINT_IN_CASE(MINT_DUP_VT)
+ i32 = READ32 (ip + 1);
+ sp->data.p = vt_sp;
+ memcpy(sp->data.p, sp [-1].data.p, i32);
+ vt_sp += (i32 + 7) & ~7;
+ ++sp;
+ ip += 3;
+ MINT_IN_BREAK;
MINT_IN_CASE(MINT_POP)
++ip;
--sp;
OPDEF(MINT_BREAK, "break", 1, MintOpNoArgs)
OPDEF(MINT_LDNULL, "ldnull", 1, MintOpNoArgs)
OPDEF(MINT_DUP, "dup", 1, MintOpNoArgs)
+OPDEF(MINT_DUP_VT, "dup.vt", 3, MintOpInt)
OPDEF(MINT_POP, "pop", 1, MintOpNoArgs)
OPDEF(MINT_RET, "ret", 1, MintOpNoArgs)
case CEE_DUP: {
int type = td.sp [-1].type;
MonoClass *klass = td.sp [-1].klass;
- if (td.sp [-1].type == STACK_TYPE_VT)
- g_warning ("dup of value type not implemented");
- SIMPLE_OP(td, MINT_DUP);
+ if (td.sp [-1].type == STACK_TYPE_VT) {
+ gint32 size = mono_class_value_size (klass, NULL);
+ PUSH_VT(&td, size);
+ ADD_CODE(&td, MINT_DUP_VT);
+ WRITE32(&td, &size);
+ td.ip ++;
+ } else
+ SIMPLE_OP(td, MINT_DUP);
PUSH_TYPE(&td, type, klass);
break;
}