Merge pull request #5406 from kumpera/fix_12157
[mono.git] / mono / mini / gc-test.cs
index 13f0813cd687e191bed815f381e4579d6afcfefc..023a56d716507bda15dc1dc604531d94b82090eb 100644 (file)
@@ -1,6 +1,8 @@
 using System;
 using System.Reflection;
 using System.Runtime.CompilerServices;
+using System.Collections;
+using System.Threading;
 
 /*
  * Regression tests for the GC support in the JIT
@@ -538,4 +540,92 @@ class Tests {
                clobber_regs_and_gc ();
                return bi1;
        }
-}
\ No newline at end of file
+
+       [MethodImplAttribute (MethodImplOptions.NoInlining)]
+       public static void liveness_12_inner (int a, int b, int c, int d, int e, int f, object o, ref string s) {
+               GC.Collect (1);
+               o.GetHashCode ();
+               s.GetHashCode ();
+       }
+
+       class FooClass {
+               public string s;
+       }
+
+       // Liveness for param area
+       public static int test_0_liveness_12 () {
+               var f = new FooClass () { s = "A" };
+               // The ref argument should be passed on the stack
+               liveness_12_inner (1, 2, 3, 4, 5, 6, new object (), ref f.s);
+               return 0;
+       }
+       
+       interface IFace {
+               int foo ();
+       }
+
+       struct BarStruct : IFace {
+               int i;
+
+               public int foo () {
+                       GC.Collect ();
+                       return i;
+               }
+       }
+               
+       public static int test_0_liveness_unbox_trampoline () {
+               var s = new BarStruct ();
+               
+               IFace iface = s;
+               iface.foo ();
+               return 0;
+       }
+
+       public static void liveness_13_inner (ref ArrayList arr) {
+               // The value of arr will be stored in a spill slot
+               arr.Add (alloc_obj_and_gc ());
+       }
+
+       // Liveness for byref arguments in spill slots
+       public static int test_0_liveness_13 () {
+               var arr = new ArrayList ();
+               liveness_13_inner (ref arr);
+               return 0;
+       }
+
+       static ThreadLocal<object> tls;
+
+       [MethodImplAttribute (MethodImplOptions.NoInlining)]
+       static void alloc_tls_obj () {
+               tls = new ThreadLocal<object> ();
+               tls.Value = new object ();
+       }
+
+       public static int test_0_thread_local () {
+               alloc_tls_obj ();
+               GC.Collect ();
+               Type t = tls.Value.GetType ();
+               if (t == typeof (object))
+                       return 0;
+               else
+                       return 1;
+       }
+
+       struct LargeBitmap {
+               public object o1, o2, o3;
+               public int i;
+               public object o4, o5, o6, o7, o9, o10, o11, o12, o13, o14, o15, o16, o17, o18, o19, o20, o21, o22, o23, o24, o25, o26, o27, o28, o29, o30, o31, o32;
+       }
+
+       public static int test_12_large_bitmap () {
+               LargeBitmap lb = new LargeBitmap ();
+               lb.o1 = 1;
+               lb.o2 = 2;
+               lb.o3 = 3;
+               lb.o32 = 6;
+
+               GC.Collect (0);
+
+               return (int)lb.o1 + (int)lb.o2 + (int)lb.o3 + (int)lb.o32;
+       }
+}