[interp] fix unaligned.
authorBernhard Urban <bernhard.urban@xamarin.com>
Mon, 22 May 2017 20:13:01 +0000 (22:13 +0200)
committerBernhard Urban <bernhard.urban@xamarin.com>
Mon, 22 May 2017 20:13:01 +0000 (22:13 +0200)
mono/mini/interp/interp.c
mono/mini/interp/transform.c

index 27b790a6a5016400cca788e7753eaf4b291852ef..ef6ac1b428cc22cd8049df54da7ad6ea1e26cdbb 100644 (file)
@@ -3485,10 +3485,13 @@ ves_exec_method_with_context (MonoInvocation *frame, ThreadContext *context, uns
                        MINT_IN_BREAK;
                MINT_IN_CASE(MINT_CPOBJ) {
                        c = rtm->data_items[* (guint16 *)(ip + 1)];
-                       g_assert (c->byval_arg.type == MONO_TYPE_VALUETYPE);
+                       g_assert (c->valuetype);
                        /* if this assertion fails, we need to add a write barrier */
                        g_assert (!MONO_TYPE_IS_REFERENCE (&c->byval_arg));
-                       stackval_from_data (&c->byval_arg, &sp [-2], sp [-1].data.p, FALSE);
+                       if (c->byval_arg.type == MONO_TYPE_VALUETYPE)
+                               stackval_from_data (&c->byval_arg, &sp [-2], sp [-1].data.p, FALSE);
+                       else
+                               stackval_from_data (&c->byval_arg, sp [-2].data.p, sp [-1].data.p, FALSE);
                        ip += 2;
                        sp -= 2;
                        MINT_IN_BREAK;
index 9354aa8737c61109ddc52c4e8e9744d18e05b506..fb2ef6b60c0e32a599846796fd10c3d74d9ab53e 100644 (file)
@@ -3237,8 +3237,7 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                                ++td.ip;
                                break;
                        case CEE_UNALIGNED_:
-                               ++td.ip;
-                               /* FIX: should do something? */;
+                               td.ip += 2;
                                break;
                        case CEE_VOLATILE_:
                                ++td.ip;