[interpreter] make mint_{ldind_i,box} so that it can also operate on elements deeper...
authorBernhard Urban <bernhard.urban@xamarin.com>
Thu, 9 Feb 2017 19:42:17 +0000 (20:42 +0100)
committerBernhard Urban <bernhard.urban@xamarin.com>
Thu, 16 Feb 2017 22:09:38 +0000 (23:09 +0100)
mono/mini/interpreter/interp.c
mono/mini/interpreter/mintops.def
mono/mini/interpreter/transform.c

index fbe624b23a426278114f282e9279acd1a77b5422..7684052260be089b64856eda816a1cdcc484d038 100644 (file)
@@ -2353,10 +2353,12 @@ ves_exec_method_with_context (MonoInvocation *frame, ThreadContext *context)
                        ++ip;
                        sp[-1].data.l = *(gint64*)sp[-1].data.p;
                        MINT_IN_BREAK;
-               MINT_IN_CASE(MINT_LDIND_I)
-                       ++ip;
-                       sp[-1].data.p = *(gpointer*)sp[-1].data.p;
+               MINT_IN_CASE(MINT_LDIND_I) {
+                       guint16 offset = * (guint16 *)(ip + 1);
+                       sp[-1 - offset].data.p = *(gpointer*)sp[-1 - offset].data.p;
+                       ip += 2;
                        MINT_IN_BREAK;
+               }
                MINT_IN_CASE(MINT_LDIND_R4)
                        ++ip;
                        sp[-1].data.f = *(gfloat*)sp[-1].data.p;
@@ -3118,23 +3120,24 @@ array_constructed:
                        sp [-1].data.i = (mono_u)sp [-1].data.l;
                        ++ip;
                        MINT_IN_BREAK;
-               MINT_IN_CASE(MINT_BOX)
+               MINT_IN_CASE(MINT_BOX) {
                        c = rtm->data_items [* (guint16 *)(ip + 1)];
+                       guint16 offset = * (guint16 *)(ip + 2);
 
                        if (c->byval_arg.type == MONO_TYPE_VALUETYPE && !c->enumtype) {
                                int size = mono_class_value_size (c, NULL);
-                               sp [-1].data.p = mono_value_box_checked (context->domain, c, sp [-1].data.p, &error);
+                               sp [-1 - offset].data.p = mono_value_box_checked (context->domain, c, sp [-1 - offset].data.p, &error);
                                mono_error_cleanup (&error); /* FIXME: don't swallow the error */
                                size = (size + 7) & ~7;
                                vt_sp -= size;
-                       }                               
-                       else {
-                               stackval_to_data (&c->byval_arg, &sp [-1], (char*)&sp [-1], FALSE);
-                               sp [-1].data.p = mono_value_box_checked (context->domain, c, &sp [-1], &error);
+                       } else {
+                               stackval_to_data (&c->byval_arg, &sp [-1 - offset], (char *) &sp [-1 - offset], FALSE);
+                               sp [-1 - offset].data.p = mono_value_box_checked (context->domain, c, &sp [-1 - offset], &error);
                                mono_error_cleanup (&error); /* FIXME: don't swallow the error */
                        }
-                       ip += 2;
+                       ip += 3;
                        MINT_IN_BREAK;
+               }
                MINT_IN_CASE(MINT_NEWARR)
                        sp [-1].data.p = (MonoObject*) mono_array_new_checked (context->domain, rtm->data_items[*(guint16 *)(ip + 1)], sp [-1].data.i, &error);
                        mono_error_cleanup (&error); /* FIXME: don't swallow the error */
index 797a0c6843f583f05e73a8d86a97cac65fe9bd22..28b1c400b9636f75dbf5123201ec2aeccc5d7a7d 100644 (file)
@@ -152,7 +152,7 @@ OPDEF(MINT_LDIND_U2, "ldind.u2", 1, MintOpNoArgs)
 OPDEF(MINT_LDIND_I4, "ldind.i4", 1, MintOpNoArgs)
 OPDEF(MINT_LDIND_U4, "ldind.u4", 1, MintOpNoArgs)
 OPDEF(MINT_LDIND_I8, "ldind.i8", 1, MintOpNoArgs)
-OPDEF(MINT_LDIND_I, "ldind.i", 1, MintOpNoArgs)
+OPDEF(MINT_LDIND_I, "ldind.i", 2, MintOpUShortInt)
 OPDEF(MINT_LDIND_R4, "ldind.r4", 1, MintOpNoArgs)
 OPDEF(MINT_LDIND_R8, "ldind.r8", 1, MintOpNoArgs)
 OPDEF(MINT_LDIND_REF, "ldind.ref", 1, MintOpNoArgs)
@@ -271,7 +271,7 @@ OPDEF(MINT_INITOBJ, "initobj", 3, MintOpInt)
 OPDEF(MINT_CASTCLASS, "castclass", 2, MintOpClassToken) 
 OPDEF(MINT_ISINST, "isinst", 2, MintOpClassToken) 
 OPDEF(MINT_NEWARR, "newarr", 2, MintOpClassToken) 
-OPDEF(MINT_BOX, "box", 2, MintOpClassToken) 
+OPDEF(MINT_BOX, "box", 3, MintOpTwoShorts)
 OPDEF(MINT_UNBOX, "unbox", 2, MintOpClassToken) 
 OPDEF(MINT_LDTOKEN, "ldtoken", 2, MintOpClassToken) /* not really */
 OPDEF(MINT_LDFTN, "ldftn", 2, MintOpMethodToken) 
index 225157528c44d3c0adbc99d2bd54f0a4e6fb098d..dafefb4eea9c7c401508c1e9fc08ef7873995662 100644 (file)
@@ -1333,6 +1333,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
                case CEE_LDIND_I:
                        CHECK_STACK (&td, 1);
                        SIMPLE_OP (td, MINT_LDIND_I);
+                       ADD_CODE (&td, 0);
                        SET_SIMPLE_TYPE(td.sp - 1, STACK_TYPE_I);
                        break;
                case CEE_LDIND_R4:
@@ -2068,6 +2069,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
                                }
                                ADD_CODE(&td, MINT_BOX);
                                ADD_CODE(&td, get_data_item_index (&td, klass));
+                               ADD_CODE (&td, 0);
                                SET_TYPE(td.sp - 1, STACK_TYPE_O, klass);
                                td.ip += 5;
                        }