[interp] fix cee_initobj for reference type
authorBernhard Urban <bernhard.urban@xamarin.com>
Tue, 7 Mar 2017 09:46:58 +0000 (10:46 +0100)
committerBernhard Urban <bernhard.urban@xamarin.com>
Wed, 8 Mar 2017 22:02:51 +0000 (23:02 +0100)
mono/mini/generics.cs
mono/mini/iltests.il
mono/mini/interp/transform.c

index b7a72223efd78329177782a69a571d858e8e1fa0..929d4718bcd33cc24117560fd066ca0b3f87a10f 100644 (file)
@@ -570,7 +570,6 @@ class Tests
                }
        }
 
-       [Category ("!INTERPRETER")]
        public static int test_0_fullaot_linq () {
                var allWords = new XElement [] { new XElement { Value = "one" } };
                var filteredWords = allWords.Where(kw => kw.Value.StartsWith("T"));
@@ -988,7 +987,6 @@ class Tests
        }
 
        // #2155
-       [Category ("!INTERPRETER")]
        [Category ("GSHAREDVT")]
        public static int test_0_fullaot_sflda_cctor () {
                List<Doc> documents = new List<Doc>();
index 6990e9e373a7ce6f1ee91a1b37af50e67825d175..bde7ae5b1db6537f19e2ab4fd4b19b388b47cd7a 100644 (file)
@@ -1373,7 +1373,6 @@ COND:   ldloc.0
        }
 
        .method public static int32 test_1_initobj_reference () {
-               .custom instance void [TestDriver]CategoryAttribute::.ctor(string) = ( 01 00 0C 21 49 4E 54 45 52 50 52 45 54 45 52 00 00 )   // ...!INTERPRETER.
                .maxstack 8
                .locals init (  
                                object v_0
index e13693b7f742bf5d54c484f5e4b59855f7403356..797d01ab65409b48c91e07050f55c47947b0624b 100644 (file)
@@ -3024,9 +3024,14 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo
                                CHECK_STACK(&td, 1);
                                token = read32 (td.ip + 1);
                                klass = mono_class_get_full (image, token, generic_context);
-                               ADD_CODE(&td, MINT_INITOBJ);
-                               i32 = mono_class_value_size (klass, NULL);
-                               WRITE32(&td, &i32);
+                               if (klass->valuetype) {
+                                       ADD_CODE (&td, MINT_INITOBJ);
+                                       i32 = mono_class_value_size (klass, NULL);
+                                       WRITE32 (&td, &i32);
+                               } else {
+                                       ADD_CODE (&td, MINT_LDNULL);
+                                       ADD_CODE (&td, MINT_STIND_REF);
+                               }
                                td.ip += 5;
                                --td.sp;
                                break;