Merge pull request #5210 from alexrp/profiler-runtime-settings
[mono.git] / mono / tests / finalizer-exception.cs
index d11e1696f1487540efebaa76a63c95f769e0e5c1..71f4b4cc20933647e7fcc1df7d36407ec6261ae7 100644 (file)
@@ -2,17 +2,38 @@ using System;
 using System.Threading;
 
 public class FinalizerException {
+
        ~FinalizerException () {
                throw new Exception ();
        }
 
+       static IntPtr aptr;
+
+       /*
+        * We allocate the exception object deep down the stack so
+        * that it doesn't get pinned.
+        */
+       public static unsafe void MakeException (int depth) {
+               // Avoid tail calls
+               int* values = stackalloc int [20];
+               aptr = new IntPtr (values);
+               if (depth <= 0) {
+                       for (int i = 0; i < 10; i++)
+                               new FinalizerException ();
+                       return;
+               }
+               MakeException (depth - 1);
+       }
+
        public static int Main () { 
                AppDomain.CurrentDomain.UnhandledException += (sender, args) => {
                        Console.WriteLine ("caught");
                        Environment.Exit (0);
                };
 
-               new FinalizerException ();
+               var t = new Thread (delegate () { MakeException (1024); });
+               t.Start ();
+               t.Join ();
 
                GC.Collect ();
                GC.WaitForPendingFinalizers ();