[interp] resolve MonoClass and MonoClassField from image like we do in mini
authorBernhard Urban <bernhard.urban@xamarin.com>
Tue, 25 Apr 2017 22:13:38 +0000 (00:13 +0200)
committerBernhard Urban <bernhard.urban@xamarin.com>
Fri, 28 Apr 2017 18:52:06 +0000 (20:52 +0200)
mono/mini/interp/transform.c
mono/mini/method-to-ir.c
mono/mini/mini.h

index b601996b822d45c2f483dc75c7db61818859ff8d..9387e5f2f1377f046ae9dd8bb5b2c921a2458b1d 100644 (file)
@@ -916,6 +916,22 @@ interp_transform_call (TransformData *td, MonoMethod *method, MonoMethod *target
        }
 }
 
+static MonoClassField *
+interp_field_from_token (MonoMethod *method, guint32 token, MonoClass **klass, MonoGenericContext *generic_context)
+{
+       MonoClassField *field = NULL;
+       if (method->wrapper_type != MONO_WRAPPER_NONE) {
+               field = (MonoClassField *) mono_method_get_wrapper_data (method, token);
+               *klass = field->parent;
+       } else {
+               MonoError error;
+               error_init (&error);
+               field = mono_field_from_token_checked (method->klass->image, token, klass, generic_context, &error);
+               mono_error_cleanup (&error); /* FIXME: don't swallow the error */
+       }
+       return field;
+}
+
 static void
 generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, MonoGenericContext *generic_context)
 {
@@ -1943,7 +1959,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                case CEE_CASTCLASS:
                        CHECK_STACK (&td, 1);
                        token = read32 (td.ip + 1);
-                       klass = mono_class_get_full (image, token, generic_context);
+                       klass = mini_get_class (method, token, generic_context);
                        ADD_CODE(&td, MINT_CASTCLASS);
                        ADD_CODE(&td, get_data_item_index (&td, klass));
                        td.sp [-1].klass = klass;
@@ -1952,7 +1968,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                case CEE_ISINST:
                        CHECK_STACK (&td, 1);
                        token = read32 (td.ip + 1);
-                       klass = mono_class_get_full (image, token, generic_context);
+                       klass = mini_get_class (method, token, generic_context);
                        ADD_CODE(&td, MINT_ISINST);
                        ADD_CODE(&td, get_data_item_index (&td, klass));
                        td.ip += 5;
@@ -1995,10 +2011,10 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                        CHECK_STACK (&td, 1);
                        token = read32 (td.ip + 1);
 
-                       g_assert (method->wrapper_type == MONO_WRAPPER_NONE);
-                       klass = mono_class_get_full (image, token, generic_context);
+                       klass = mini_get_class (method, token, generic_context);
 
                        if (mini_type_is_reference (&klass->byval_arg)) {
+                               int mt = mint_type (&klass->byval_arg);
                                ADD_CODE (&td, MINT_CASTCLASS);
                                ADD_CODE (&td, get_data_item_index (&td, klass));
                                SET_TYPE (td.sp - 1, stack_type [mt], klass);
@@ -2033,7 +2049,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                case CEE_LDFLDA:
                        CHECK_STACK (&td, 1);
                        token = read32 (td.ip + 1);
-                       field = mono_field_from_token (image, token, &klass, generic_context);
+                       field = interp_field_from_token (method, token, &klass, generic_context);
                        gboolean is_static = !!(field->type->attrs & FIELD_ATTRIBUTE_STATIC);
                        mono_class_init (klass);
                        if (is_static) {
@@ -2056,7 +2072,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                case CEE_LDFLD: {
                        CHECK_STACK (&td, 1);
                        token = read32 (td.ip + 1);
-                       field = mono_field_from_token (image, token, &klass, generic_context);
+                       field = interp_field_from_token (method, token, &klass, generic_context);
                        gboolean is_static = !!(field->type->attrs & FIELD_ATTRIBUTE_STATIC);
                        mono_class_init (klass);
 
@@ -2097,7 +2113,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                case CEE_STFLD: {
                        CHECK_STACK (&td, 2);
                        token = read32 (td.ip + 1);
-                       field = mono_field_from_token (image, token, &klass, generic_context);
+                       field = interp_field_from_token (method, token, &klass, generic_context);
                        gboolean is_static = !!(field->type->attrs & FIELD_ATTRIBUTE_STATIC);
                        mono_class_init (klass);
                        mt = mint_type(field->type);
@@ -2129,7 +2145,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                }
                case CEE_LDSFLDA:
                        token = read32 (td.ip + 1);
-                       field = mono_field_from_token (image, token, &klass, generic_context);
+                       field = interp_field_from_token (method, token, &klass, generic_context);
                        ADD_CODE(&td, MINT_LDSFLDA);
                        ADD_CODE(&td, get_data_item_index (&td, field));
                        td.ip += 5;
@@ -2137,7 +2153,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                        break;
                case CEE_LDSFLD:
                        token = read32 (td.ip + 1);
-                       field = mono_field_from_token (image, token, &klass, generic_context);
+                       field = interp_field_from_token (method, token, &klass, generic_context);
                        mt = mint_type(field->type);
                        ADD_CODE(&td, mt == MINT_TYPE_VT ? MINT_LDSFLD_VT : MINT_LDSFLD);
                        ADD_CODE(&td, get_data_item_index (&td, field));
@@ -2158,7 +2174,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                case CEE_STSFLD:
                        CHECK_STACK (&td, 1);
                        token = read32 (td.ip + 1);
-                       field = mono_field_from_token (image, token, &klass, generic_context);
+                       field = interp_field_from_token (method, token, &klass, generic_context);
                        mt = mint_type(field->type);
                        ADD_CODE(&td, mt == MINT_TYPE_VT ? MINT_STSFLD_VT : MINT_STSFLD);
                        ADD_CODE(&td, get_data_item_index (&td, field));
@@ -2178,7 +2194,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                        if (method->wrapper_type != MONO_WRAPPER_NONE)
                                klass = (MonoClass *)mono_method_get_wrapper_data (method, token);
                        else
-                               klass = mono_class_get_full (image, token, generic_context);
+                               klass = mini_get_class (method, token, generic_context);
 
                        ADD_CODE(&td, td.sp [-1].type == STACK_TYPE_VT ? MINT_STOBJ_VT : MINT_STOBJ);
                        ADD_CODE(&td, get_data_item_index (&td, klass));
@@ -2247,7 +2263,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                        if (method->wrapper_type != MONO_WRAPPER_NONE)
                                klass = (MonoClass *)mono_method_get_wrapper_data (method, token);
                        else
-                               klass = mono_class_get_full (image, token, generic_context);
+                               klass = mini_get_class (method, token, generic_context);
 
                        if (mono_class_is_nullable (klass)) {
                                MonoMethod *target_method = mono_class_get_method_from_name (klass, "Box", 1);
@@ -2278,7 +2294,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                        if (method->wrapper_type != MONO_WRAPPER_NONE)
                                klass = (MonoClass *)mono_method_get_wrapper_data (method, token);
                        else
-                               klass = mono_class_get_full (image, token, generic_context);
+                               klass = mini_get_class (method, token, generic_context);
 
                        unsigned char lentype = (td.sp - 1)->type;
                        if (lentype == STACK_TYPE_I8) {
@@ -2308,7 +2324,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                        if (method->wrapper_type != MONO_WRAPPER_NONE)
                                klass = (MonoClass *) mono_method_get_wrapper_data (method, token);
                        else
-                               klass = mono_class_get_full (image, token, generic_context);
+                               klass = mini_get_class (method, token, generic_context);
 
                        if (!klass->valuetype && method->wrapper_type == MONO_WRAPPER_NONE && !readonly) {
                                ADD_CODE (&td, MINT_LDELEMA_TC);
@@ -2404,7 +2420,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                case CEE_LDELEM:
                        CHECK_STACK (&td, 2);
                        token = read32 (td.ip + 1);
-                       klass = mono_class_get_full (image, token, generic_context);
+                       klass = mini_get_class (method, token, generic_context);
                        switch (mint_type (&klass->byval_arg)) {
                                case MINT_TYPE_I1:
                                        ENSURE_I4 (&td, 1);
@@ -2534,7 +2550,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                        CHECK_STACK (&td, 3);
                        ENSURE_I4 (&td, 2);
                        token = read32 (td.ip + 1);
-                       klass = mono_class_get_full (image, token, generic_context);
+                       klass = mini_get_class (method, token, generic_context);
                        switch (mint_type (&klass->byval_arg)) {
                                case MINT_TYPE_U1:
                                        SIMPLE_OP (td, MINT_STELEM_U1);
@@ -3141,7 +3157,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                        case CEE_INITOBJ:
                                CHECK_STACK(&td, 1);
                                token = read32 (td.ip + 1);
-                               klass = mono_class_get_full (image, token, generic_context);
+                               klass = mini_get_class (method, token, generic_context);
                                if (klass->valuetype) {
                                        ADD_CODE (&td, MINT_INITOBJ);
                                        i32 = mono_class_value_size (klass, NULL);
@@ -3166,7 +3182,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                                break;
                        case CEE_CONSTRAINED_:
                                token = read32 (td.ip + 1);
-                               constrained_class = mono_class_get_full (image, token, generic_context);
+                               constrained_class = mini_get_class (method, token, generic_context);
                                mono_class_init (constrained_class);
                                td.ip += 5;
                                break;
@@ -3196,7 +3212,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                                        size = mono_type_size (type, &align);
                                } else {
                                        int align;
-                                       MonoClass *szclass = mono_class_get_full (image, token, generic_context);
+                                       MonoClass *szclass = mini_get_class (method, token, generic_context);
                                        mono_class_init (szclass);
 #if 0
                                        if (!szclass->valuetype)
@@ -3430,7 +3446,7 @@ mono_interp_transform_method (RuntimeMethod *runtime_method, ThreadContext *cont
                        break;
                case MonoInlineType:
                        if (method->wrapper_type == MONO_WRAPPER_NONE) {
-                               class = mono_class_get_full (image, read32 (ip + 1), generic_context);
+                               class = mini_get_class (method, read32 (ip + 1), generic_context);
                                mono_class_init (class);
                                /* quick fix to not do this for the fake ptr classes - probably should not be getting the vtable at all here */
 #if 0
index c47792226c4e983bd2eb1332ff5495c43292e7a1..42cfa1b7bcbe5bec782d576aaae349515b70bd4b 100644 (file)
@@ -6780,7 +6780,7 @@ mini_get_method (MonoCompile *cfg, MonoMethod *m, guint32 token, MonoClass *klas
        return method;
 }
 
-static inline MonoClass*
+MonoClass*
 mini_get_class (MonoMethod *method, guint32 token, MonoGenericContext *context)
 {
        MonoError error;
index 98714bd220097cd5d8fc5c8f008c8b665e1cca7d..e33dcf85d7f6e355d000bf3be5e818a2c6d59c93 100644 (file)
@@ -3061,6 +3061,7 @@ MonoGenericContext* mini_class_get_context (MonoClass *klass);
 
 MonoType* mini_get_underlying_type (MonoType *type) MONO_LLVM_INTERNAL;
 MonoType* mini_type_get_underlying_type (MonoType *type);
+MonoClass* mini_get_class (MonoMethod *method, guint32 token, MonoGenericContext *context);
 MonoMethod* mini_get_shared_method (MonoMethod *method);
 MonoMethod* mini_get_shared_method_to_register (MonoMethod *method);
 MonoMethod* mini_get_shared_method_full (MonoMethod *method, gboolean all_vt, gboolean is_gsharedvt);