* HttpSimpleProtocolImporter.cs: Implemented internal method to support
[mono.git] / mono / interpreter / transform.c
index 145a65f3ebe18f788642225057b1ca9693fd8f3b..3fd3dd7a93f0432a1228829d833f177fcb7d99ea 100644 (file)
@@ -907,9 +907,14 @@ generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
                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;
                }
@@ -2395,15 +2400,19 @@ generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
                                        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 ();