* HttpSimpleProtocolImporter.cs: Implemented internal method to support
[mono.git] / mono / interpreter / transform.c
index c7cd8acea95c81fb4066c687729fa903c505c4d2..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;
                }
@@ -2380,26 +2385,47 @@ generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
                case CEE_UNUSED41:
                        ++td.ip;
                        switch (*td.ip) {
-                       case CEE_MONO_FUNC1:
-                               ADD_CODE(&td, MINT_MONO_CONV1);
-                               ADD_CODE(&td, *(td.ip + 1));
-                               td.ip += 2;
-                               SET_SIMPLE_TYPE(td.sp - 1, STACK_TYPE_I);
-                               break;
-                       case CEE_MONO_PROC2:
-                               CHECK_STACK (&td, 2);
-                               ADD_CODE(&td, MINT_MONO_CONV2);
-                               ADD_CODE(&td, *(td.ip + 1));
-                               td.ip += 2;
-                               td.sp -= 2;
-                               break;
-                       case CEE_MONO_PROC3:
-                               CHECK_STACK (&td, 3);
-                               ADD_CODE(&td, MINT_MONO_CONV3);
-                               ADD_CODE(&td, *(td.ip + 1));
-                               td.ip += 2;
-                               td.sp -= 3;
-                               break;
+                               case CEE_MONO_ICALL: {
+                                       guint32 token;
+                                       gpointer func;
+                                       MonoJitICallInfo *info;
+
+                                       token = read32 (td.ip + 1);
+                                       td.ip += 5;
+                                       func = mono_method_get_wrapper_data (method, token);
+                                       info = mono_find_jit_icall_by_addr (func);
+                                       g_assert (info);
+
+                                       CHECK_STACK (&td, info->sig->param_count);
+                                       switch (info->sig->param_count) {
+                                       case 1:
+                                               if (MONO_TYPE_IS_VOID (info->sig->ret))
+                                                       ADD_CODE (&td,MINT_ICALL_P_V);
+                                               else
+                                                       ADD_CODE (&td,MINT_ICALL_P_P);
+                                               break;
+                                       case 2:
+                                               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:
+                                               g_assert (MONO_TYPE_IS_VOID (info->sig->ret));
+                                               ADD_CODE (&td,MINT_ICALL_PPP_V);
+                                               break;
+                                       default:
+                                               g_assert_not_reached ();
+                                       }
+                                       ADD_CODE(&td, get_data_item_index (&td, func));
+                                       td.sp -= info->sig->param_count;
+
+                                       if (!MONO_TYPE_IS_VOID (info->sig->ret)) {
+                                               td.sp ++;
+                                               SET_SIMPLE_TYPE(td.sp - 1, STACK_TYPE_I);
+                                       }
+                                       break;
+                               }
                        case CEE_MONO_VTADDR: {
                                int size;
                                CHECK_STACK (&td, 1);
@@ -2424,12 +2450,6 @@ generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
                                td.sp [0].type = STACK_TYPE_I;
                                ++td.sp;
                                break;
-                       case CEE_MONO_FREE:
-                               CHECK_STACK (&td, 1);
-                               ADD_CODE(&td, MINT_MONO_FREE);
-                               ++td.ip;
-                               --td.sp;
-                               break;
                        case CEE_MONO_OBJADDR:
                                CHECK_STACK (&td, 1);
                                ++td.ip;
@@ -2465,6 +2485,10 @@ generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
                                g_assert(klass->valuetype);
                                SET_SIMPLE_TYPE(td.sp - 1, STACK_TYPE_MP);
                                break;
+                       case CEE_MONO_SAVE_LMF:
+                       case CEE_MONO_RESTORE_LMF:
+                               ++td.ip;
+                               break;
                        default:
                                g_error ("transform.c: Unimplemented opcode: 0xF0 %02x at 0x%x\n", *td.ip, td.ip-header->code);
                        }
@@ -2860,7 +2884,7 @@ mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *cont
                }
                else if (in == 0xf0) {
                        ip++;
-                       in = *ip + MONO_CEE_MONO_FUNC1;
+                       in = *ip + MONO_CEE_MONO_ICALL;
                }
                opcode = &mono_opcodes [in];
                switch (opcode->argument) {