Merge pull request #4752 from BrzVlad/feature-dynamic-nrs
[mono.git] / mono / mini / interp / transform.c
index 182ef3ac84f5a9d52b604c6c6931d7ac6a9c5aa1..4ffb0d614559b0a0bc0d9c27d9b84804cad613d5 100644 (file)
@@ -259,17 +259,6 @@ binary_arith_op(TransformData *td, int mint_op)
        --td->sp;
 }
 
-static void
-binary_int_op(TransformData *td, int mint_op)
-{
-       int op = mint_op + td->sp [-1].type - STACK_TYPE_I4;
-       CHECK_STACK(td, 2);
-       if (td->sp [-1].type != td->sp [-2].type)
-               g_warning("%s.%s: int type mismatch", td->method->klass->name, td->method->name);
-       ADD_CODE(td, op);
-       --td->sp;
-}
-
 static void
 shift_op(TransformData *td, int mint_op)
 {
@@ -332,6 +321,8 @@ enum_type:
                        goto enum_type;
                } else
                        return MINT_TYPE_VT;
+       case MONO_TYPE_TYPEDBYREF:
+               return MINT_TYPE_VT;
        case MONO_TYPE_GENERICINST:
                type = &type->data.generic_class->container_class->byval_arg;
                goto enum_type;
@@ -804,7 +795,8 @@ interp_transform_call (TransformData *td, MonoMethod *method, MonoMethod *target
        CHECK_STACK (td, csignature->param_count + csignature->hasthis);
        if (!calli && (!virtual || (target_method->flags & METHOD_ATTRIBUTE_VIRTUAL) == 0) &&
                (target_method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) == 0 && 
-               (target_method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) == 0) {
+               (target_method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) == 0 &&
+               !(target_method->iflags & METHOD_IMPL_ATTRIBUTE_NOINLINING)) {
                int called_inited = mono_class_vtable (domain, target_method->klass)->initialized;
                MonoMethodHeader *mheader = mono_method_get_header (target_method);
 
@@ -828,9 +820,10 @@ interp_transform_call (TransformData *td, MonoMethod *method, MonoMethod *target
                        if (mheader && *mheader->code == CEE_RET && called_inited) {
                                if (mono_interp_traceopt)
                                        g_print ("Inline (empty) call of %s.%s\n", target_method->klass->name, target_method->name);
-                               for (i = 0; i < csignature->param_count; i++)
+                               for (i = 0; i < csignature->param_count; i++) {
                                        ADD_CODE (td, MINT_POP); /*FIX: vt */
                                        ADD_CODE (td, 0);
+                               }
                                if (csignature->hasthis) {
                                        if (virtual)
                                                ADD_CODE(td, MINT_CKNULL);
@@ -1615,23 +1608,23 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                        ++td.ip;
                        break;
                case CEE_REM:
-                       binary_int_op (&td, MINT_REM_I4);
+                       binary_arith_op (&td, MINT_REM_I4);
                        ++td.ip;
                        break;
                case CEE_REM_UN:
-                       binary_int_op (&td, MINT_REM_UN_I4);
+                       binary_arith_op (&td, MINT_REM_UN_I4);
                        ++td.ip;
                        break;
                case CEE_AND:
-                       binary_int_op (&td, MINT_AND_I4);
+                       binary_arith_op (&td, MINT_AND_I4);
                        ++td.ip;
                        break;
                case CEE_OR:
-                       binary_int_op (&td, MINT_OR_I4);
+                       binary_arith_op (&td, MINT_OR_I4);
                        ++td.ip;
                        break;
                case CEE_XOR:
-                       binary_int_op (&td, MINT_XOR_I4);
+                       binary_arith_op (&td, MINT_XOR_I4);
                        ++td.ip;
                        break;
                case CEE_SHL:
@@ -2643,12 +2636,37 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
 #if SIZEOF_VOID_P == 8
                case CEE_CONV_OVF_U:
 #endif
-               case CEE_REFANYVAL: ves_abort(); break;
 #endif
                case CEE_CKFINITE:
                        CHECK_STACK (&td, 1);
                        SIMPLE_OP (td, MINT_CKFINITE);
                        break;
+               case CEE_MKREFANY:
+                       CHECK_STACK (&td, 1);
+                       ENSURE_I4 (&td, 2);
+                       token = read32 (td.ip + 1);
+                       klass = mini_get_class (method, token, generic_context);
+
+                       ADD_CODE (&td, MINT_MKREFANY);
+                       ADD_CODE (&td, get_data_item_index (&td, klass));
+
+                       td.ip += 5;
+                       PUSH_VT (&td, sizeof (MonoTypedRef));
+                       SET_TYPE(td.sp - 1, STACK_TYPE_VT, mono_defaults.typed_reference_class);
+                       break;
+               case CEE_REFANYVAL: {
+                       CHECK_STACK (&td, 1);
+                       ENSURE_I4 (&td, 2);
+                       token = read32 (td.ip + 1);
+
+                       ADD_CODE (&td, MINT_REFANYVAL);
+
+                       POP_VT (&td, sizeof (MonoTypedRef));
+                       SET_SIMPLE_TYPE(td.sp - 1, STACK_TYPE_MP);
+
+                       td.ip += 5;
+                       break;
+               }
                case CEE_CONV_OVF_I1:
                case CEE_CONV_OVF_I1_UN:
                        CHECK_STACK (&td, 1);
@@ -3298,9 +3316,13 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                                PUSH_SIMPLE_TYPE(&td, STACK_TYPE_I4);
                                break;
                        }
-#if 0
-                       case CEE_REFANYTYPE: ves_abort(); break;
-#endif
+                       case CEE_REFANYTYPE:
+                               ADD_CODE (&td, MINT_REFANYTYPE);
+                               td.ip += 1;
+                               POP_VT (&td, sizeof (MonoTypedRef));
+                               PUSH_VT (&td, sizeof (gpointer));
+                               SET_TYPE(td.sp - 1, STACK_TYPE_VT, NULL);
+                               break;
                        default:
                                g_error ("transform.c: Unimplemented opcode: 0xFE %02x (%s) at 0x%x\n", *td.ip, mono_opcode_name (256 + *td.ip), td.ip-header->code);
                        }