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;
}
switch (info->sig->param_count) {
case 1:
if (MONO_TYPE_IS_VOID (info->sig->ret))
- ADD_CODE (&td,MINT_MONO_PROC1);
+ ADD_CODE (&td,MINT_ICALL_P_V);
else
- ADD_CODE (&td,MINT_MONO_CONV1);
+ ADD_CODE (&td,MINT_ICALL_P_P);
break;
case 2:
- ADD_CODE (&td,MINT_MONO_CONV2);
+ if (MONO_TYPE_IS_VOID (info->sig->ret))
+ ADD_CODE (&td,MINT_ICALL_PP_V);
+ else
+ ADD_CODE (&td,MINT_ICALL_PP_P);
break;
case 3:
- ADD_CODE (&td,MINT_MONO_CONV3);
+ g_assert (MONO_TYPE_IS_VOID (info->sig->ret));
+ ADD_CODE (&td,MINT_ICALL_PPP_V);
break;
default:
g_assert_not_reached ();