Await support for more expressions
authorMarek Safar <marek.safar@gmail.com>
Fri, 15 Jul 2011 14:53:17 +0000 (15:53 +0100)
committerMarek Safar <marek.safar@gmail.com>
Fri, 15 Jul 2011 14:53:17 +0000 (15:53 +0100)
mcs/mcs/anonymous.cs
mcs/mcs/assign.cs
mcs/mcs/complete.cs
mcs/mcs/dynamic.cs
mcs/mcs/ecore.cs
mcs/mcs/enum.cs
mcs/mcs/method.cs
mcs/mcs/nullable.cs
mcs/mcs/statement.cs
mcs/tests/test-async-13.cs
mcs/tests/ver-il-net_4_0.xml

index bd6da5b602f4387f8d8b9aaa1d7400362cad8fab..f168524d288488b13c7ffaab41ccb81bbb80a1f2 100644 (file)
@@ -583,6 +583,11 @@ namespace Mono.CSharp {
                                this.hv = hv;
                        }
 
+                       public override bool ContainsEmitWithAwait ()
+                       {
+                               return false;
+                       }
+
                        public override Expression CreateExpressionTree (ResolveContext ec)
                        {
                                return hv.CreateExpressionTree ();
@@ -1042,6 +1047,11 @@ namespace Mono.CSharp {
                        return am.ReturnType;
                }
 
+               public override bool ContainsEmitWithAwait ()
+               {
+                       return false;
+               }
+
                //
                // Returns AnonymousMethod container if this anonymous method
                // expression can be implicitly converted to the delegate type `delegate_type'
@@ -1480,6 +1490,11 @@ namespace Mono.CSharp {
 
                #endregion
 
+               public override bool ContainsEmitWithAwait ()
+               {
+                       return false;
+               }
+
                public override Expression CreateExpressionTree (ResolveContext ec)
                {
                        ec.Report.Error (1945, loc, "An expression tree cannot contain an anonymous method expression");
index 92d503dcae018152accdc785a33ac369b30c361c..292c4cac6f5c5222dee352fa5443c3ce4f5f16cd 100644 (file)
@@ -201,6 +201,11 @@ namespace Mono.CSharp {
                        builder = null;
                }
 
+               public override bool ContainsEmitWithAwait ()
+               {
+                       return false;
+               }
+
                public override Expression CreateExpressionTree (ResolveContext ec)
                {
                        Arguments args = new Arguments (1);
index 965416e79b718d80423eb56cabefa9aac46ed291..a8641784e189d1b3c5ff7e786280bac49f31de3b 100644 (file)
@@ -43,19 +43,24 @@ namespace Mono.CSharp {
                        }
                }
 
-               public override void EmitStatement (EmitContext ec)
+               public override bool ContainsEmitWithAwait ()
                {
-                       // Do nothing
+                       return false;
                }
 
-               public override void Emit (EmitContext ec)
+               public override Expression CreateExpressionTree (ResolveContext ec)
+               {
+                       return null;
+               }
+
+               public override void EmitStatement (EmitContext ec)
                {
                        // Do nothing
                }
 
-               public override Expression CreateExpressionTree (ResolveContext ec)
+               public override void Emit (EmitContext ec)
                {
-                       return null;
+                       // Do nothing
                }
        }
        
index 31f00c280486e658a79cf2d6bb5051719aa5877b..b3daab895b22702d49140573cd5fe70be149381b 100644 (file)
@@ -95,9 +95,14 @@ namespace Mono.CSharp
                        throw new NotImplementedException ();
                }
 
+               public override bool ContainsEmitWithAwait ()
+               {
+                       throw new NotSupportedException ();
+               }
+
                public override Expression CreateExpressionTree (ResolveContext ec)
                {
-                       throw new NotImplementedException ();
+                       throw new NotSupportedException ();
                }
 
                protected override Expression DoResolve (ResolveContext ec)
index b45b1925261ab2941be6ffd10c2c3012af91ed6b..93892d271de7fe154667c99b37e97914f16cabaa 100644 (file)
@@ -1862,6 +1862,11 @@ namespace Mono.CSharp {
                                this.loc = orig.Location;
                        }
 
+                       public override bool ContainsEmitWithAwait ()
+                       {
+                               return stm.ContainsEmitWithAwait ();
+                       }
+
                        public override Expression CreateExpressionTree (ResolveContext ec)
                        {
                                return orig_expr.CreateExpressionTree (ec);
@@ -1904,6 +1909,11 @@ namespace Mono.CSharp {
 
                #endregion
 
+               public override bool ContainsEmitWithAwait ()
+               {
+                       return expr.ContainsEmitWithAwait ();
+               }
+
                //
                // Creates fully resolved expression switcher
                //
@@ -1987,6 +1997,11 @@ namespace Mono.CSharp {
                        this.loc = expr.Location;
                }
 
+               public override bool ContainsEmitWithAwait ()
+               {
+                       return expr.ContainsEmitWithAwait ();
+               }
+
                public override Expression CreateExpressionTree (ResolveContext rc)
                {
                        return expr.CreateExpressionTree (rc);
index ad36008c45e598b495f69cb87c5bb4e95e7c5339..4b0f4a020432e8691595e31a69658726ba7def7b 100644 (file)
@@ -111,6 +111,11 @@ namespace Mono.CSharp {
                                this.prev = prev;
                        }
 
+                       public override bool ContainsEmitWithAwait ()
+                       {
+                               return false;
+                       }
+
                        public override Expression CreateExpressionTree (ResolveContext ec)
                        {
                                throw new NotSupportedException ("Missing Resolve call");
index 33f2abe950a52ae0932bde85e8c561932310d4c4..16e2740af8ae2ac92bb9382b95d7e1e5ec7dec61 100644 (file)
@@ -1311,6 +1311,11 @@ namespace Mono.CSharp {
                        }
                }
 
+               public override bool ContainsEmitWithAwait ()
+               {
+                       throw new NotSupportedException ();
+               }
+
                public override Expression CreateExpressionTree (ResolveContext ec)
                {
                        throw new NotSupportedException ("ET");
index 6a3e39bf42431dd79e9054eeb8e3755cb2320562..43d8a6c61be6d6c3148dac6112c9bd047f11700c 100644 (file)
@@ -96,6 +96,11 @@ namespace Mono.CSharp.Nullable
                        eclass = expr.eclass;
                }
 
+               public override bool ContainsEmitWithAwait ()
+               {
+                       return expr.ContainsEmitWithAwait ();
+               }
+
                public static Expression Create (Expression expr)
                {
                        //
@@ -396,6 +401,11 @@ namespace Mono.CSharp.Nullable
                        : this (expr, unwrap as Unwrap, type)
                {
                }
+
+               public override bool ContainsEmitWithAwait ()
+               {
+                       return unwrap.ContainsEmitWithAwait ();
+               }
                
                public override Expression CreateExpressionTree (ResolveContext ec)
                {
@@ -687,7 +697,7 @@ namespace Mono.CSharp.Nullable
                        }
 
                        left_unwrap.Emit (ec);
-                       ec.Emit (OpCodes.Brtrue_S, load_right);
+                       ec.Emit (OpCodes.Brtrue, load_right);
 
                        // value & null, value | null
                        if (right_unwrap != null) {
@@ -765,6 +775,11 @@ namespace Mono.CSharp.Nullable
                                user_operator.Emit (ec);
                                ec.Emit (Oper == Operator.Equality ? OpCodes.Brfalse_S : OpCodes.Brtrue_S, dissimilar_label);
                        } else {
+                               if (ec.HasSet (BuilderContext.Options.AsyncBody) && right.ContainsEmitWithAwait ()) {
+                                       left = left.EmitToField (ec);
+                                       right = right.EmitToField (ec);
+                               }
+
                                left.Emit (ec);
                                right.Emit (ec);
 
@@ -1151,6 +1166,14 @@ namespace Mono.CSharp.Nullable
                        return this;
                }
 
+               public override bool ContainsEmitWithAwait ()
+               {
+                       if (unwrap != null)
+                               return unwrap.ContainsEmitWithAwait () || right.ContainsEmitWithAwait ();
+
+                       return left.ContainsEmitWithAwait () || right.ContainsEmitWithAwait ();
+               }
+
                protected override Expression DoResolve (ResolveContext ec)
                {
                        left = left.Resolve (ec);
@@ -1228,6 +1251,11 @@ namespace Mono.CSharp.Nullable
                        this.loc = loc;
                }
 
+               public override bool ContainsEmitWithAwait ()
+               {
+                       return unwrap.ContainsEmitWithAwait ();
+               }
+
                public override Expression CreateExpressionTree (ResolveContext ec)
                {
                        return new SimpleAssign (this, this).CreateExpressionTree (ec);
index 9e6cc6b2932535dcd9994b9b869904208f1b7eb7..0aefc04c2cd9ccffddfc94519f6853fd8fda2bf2 100644 (file)
@@ -2381,6 +2381,11 @@ namespace Mono.CSharp {
                                this.block = block;
                        }
 
+                       public override bool ContainsEmitWithAwait ()
+                       {
+                               return child.ContainsEmitWithAwait ();
+                       }
+
                        public override Expression CreateExpressionTree (ResolveContext ec)
                        {
                                throw new NotSupportedException ();
index 3d0bfdc89c16a0b43676b670a40a12d0d7a48a44..0a8af63ffd28d4586f6e4b1ed29df07f304b4856 100644 (file)
@@ -224,13 +224,19 @@ class Tester : Base
                int[] a = new int[3] { 3, 6, 9 };
                return a [await Task.Factory.StartNew (() => (long)1)] + value;
        }
-
+       
        async Task<int> AssignTest_1 ()
        {
                field_int = await Task.Factory.StartNew (() => 0);
                return field_int;
        }
        
+       async Task<bool> AssignTest_2 ()
+       {
+               long? l = await Task.Factory.StartNew<sbyte?> (() => null);
+               return l == null;
+       }
+       
        async Task<int> BinaryTest_1 ()
        {
                return await Task.Factory.StartNew (() => { Thread.Sleep (10); return 5; }) +
@@ -248,6 +254,36 @@ class Tester : Base
                return b ? -1 : i == 8 ? 0 : i;
        }
        
+       async Task<int> BinaryTest_3 ()
+       {
+               var r = await Task.Factory.StartNew<bool?> (() => true) & await Task.Factory.StartNew<bool?> (() => null);
+               if (r != null)
+                       return 1;
+
+               r = await Task.Factory.StartNew<bool?> (() => null) | await Task.Factory.StartNew<bool?> (() => true);
+               if (r != true)
+                       return 2;
+               
+               r = await Task.Factory.StartNew<bool?> (() => null) != await Task.Factory.StartNew<bool?> (() => true);
+               if (r != true)
+                       return 3;
+
+               return 0;
+       }
+       
+       async Task<int> BinaryTest_4 ()
+       {
+               var r1 = await Task.Factory.StartNew<short?> (() => 2) * await Task.Factory.StartNew<byte?> (() => null);
+               if (r1 != null)
+                       return 1;
+
+               var r2 = await Task.Factory.StartNew<decimal?> (() => 100) / await Task.Factory.StartNew<decimal?> (() => null);
+               if (r2 != null)
+                       return 2;
+               
+               return 0;
+       }
+       
        async Task<int> CallTest_1 ()
        {
                return Call (
@@ -297,6 +333,18 @@ class Tester : Base
                var t = new Tester ();
                return t.CallS (await Task.Factory.StartNew (() => this)) == 400;
        }
+
+       async Task<bool> CoalescingTest_1 ()
+       {
+               var r = await Task.Factory.StartNew<string> (() => null)  ?? await Task.Factory.StartNew (() => "x");
+               return r == "x";
+       }
+
+       async Task<bool> CoalescingTest_2 ()
+       {
+               var r = await Task.Factory.StartNew<short?> (() => null)  ?? await Task.Factory.StartNew<byte> (() => 2);
+               return r == 2;
+       }
        
        async Task<int> ConditionalTest_1 ()
        {
@@ -341,7 +389,7 @@ class Tester : Base
                CallEvent ();
                return value - 5;
        }
-
+       
        async Task<bool> IndexerTest_1 ()
        {
                this[2] = await Task.Factory.StartNew (() => 6);
@@ -409,6 +457,12 @@ class Tester : Base
                return true;
        }
 
+       async Task<bool> IsTest_2 ()
+       {
+               var r = await Task.Factory.StartNew<uint?> (() => 1) is uint;
+               return r;
+       }
+       
        async Task<bool> LogicalUserOperator_1 ()
        {
                var r = await Task.Factory.StartNew (() => new Base ()) && await Task.Factory.StartNew (() => new Base ());
@@ -571,7 +625,22 @@ class Tester : Base
                long a = 1;
                return (a + checked (-await Task.Factory.StartNew (() => 2))) == -1;
        }
-
+       
+       async Task<bool> UnaryTest_2 ()
+       {
+               short? s = 2;
+               int value = 2;
+               return (value * ~await Task.Factory.StartNew (() => s)) == -6;
+       }
+       
+       async Task<bool> UnaryTest_3 ()
+       {
+               var d = new decimal? [2];
+               d[1] = 4;
+               var r = ++d[await Task.Factory.StartNew (() => 1)];
+               return r == 5;
+       }
+       
        static bool RunTest (MethodInfo test)
        {
                Console.Write ("Running test {0, -25}", test.Name);
index 3f6f4471d2ec9b5ab491679f2c6f1adf2967b16d..f4ba66bc5d0c26429afafe027a63ebb23b74a1e4 100644 (file)
         <size>7</size>
       </method>
       <method name="Void Main(System.String[])">
-        <size>920</size>
+        <size>938</size>
       </method>
     </type>
   </test>
         <size>7</size>
       </method>
       <method name="Int32 Main()">
-        <size>2199</size>
+        <size>2253</size>
       </method>
     </type>
   </test>
         <size>26</size>
       </method>
       <method name="Void Main()">
-        <size>88</size>
+        <size>91</size>
       </method>
     </type>
   </test>
   <test name="gtest-540.cs">
     <type name="C">
       <method name="Int32 Main()">
-        <size>809</size>
+        <size>845</size>
       </method>
       <method name="Void .ctor()">
         <size>7</size>
         <size>2</size>
       </method>
       <method name="Int32 Main()">
-        <size>104</size>
+        <size>110</size>
       </method>
     </type>
   </test>
     </type>
     <type name="Tester+&lt;&gt;c__async7">
       <method name="Void MoveNext()">
-        <size>428</size>
+        <size>253</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async8">
       <method name="Void MoveNext()">
-        <size>459</size>
+        <size>428</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async9">
       <method name="Void MoveNext()">
-        <size>423</size>
+        <size>459</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__asyncA">
       <method name="Void MoveNext()">
-        <size>246</size>
+        <size>1095</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__asyncB">
       <method name="Void MoveNext()">
-        <size>216</size>
+        <size>779</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__asyncC">
       <method name="Void MoveNext()">
-        <size>206</size>
+        <size>423</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__asyncD">
       <method name="Void MoveNext()">
-        <size>272</size>
+        <size>246</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__asyncE">
       <method name="Void MoveNext()">
-        <size>225</size>
+        <size>216</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__asyncF">
       <method name="Void MoveNext()">
-        <size>207</size>
+        <size>206</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async10">
       <method name="Void MoveNext()">
-        <size>41</size>
+        <size>272</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async11">
       <method name="Void MoveNext()">
-        <size>315</size>
+        <size>225</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async12">
       <method name="Void MoveNext()">
-        <size>333</size>
+        <size>207</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async13">
       <method name="Void MoveNext()">
-        <size>222</size>
+        <size>337</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async14">
       <method name="Void MoveNext()">
-        <size>250</size>
+        <size>349</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async15">
       <method name="Void MoveNext()">
-        <size>196</size>
+        <size>41</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async16">
       <method name="Void MoveNext()">
-        <size>204</size>
+        <size>315</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async17">
       <method name="Void MoveNext()">
-        <size>321</size>
+        <size>333</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async18">
       <method name="Void MoveNext()">
-        <size>350</size>
+        <size>222</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async19">
       <method name="Void MoveNext()">
-        <size>381</size>
+        <size>250</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async1A">
       <method name="Void MoveNext()">
-        <size>491</size>
+        <size>196</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
         <size>2</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async9">
-      <method name="Int32 &lt;&gt;m__1D()">
-        <size>2</size>
-      </method>
-    </type>
-    <type name="Tester+&lt;&gt;c__asyncA">
-      <method name="Int32 &lt;&gt;m__1E()">
-        <size>9</size>
-      </method>
-    </type>
     <type name="Tester+&lt;&gt;c__async1B">
       <method name="Void MoveNext()">
-        <size>537</size>
-      </method>
-      <method name="Int32 &lt;&gt;m__38()">
-        <size>3</size>
+        <size>204</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async1C">
       <method name="Void MoveNext()">
-        <size>235</size>
+        <size>321</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async1D">
       <method name="Void MoveNext()">
-        <size>224</size>
+        <size>350</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async1E">
       <method name="Void MoveNext()">
-        <size>368</size>
+        <size>381</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async1F">
       <method name="Void MoveNext()">
-        <size>273</size>
+        <size>491</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async20">
       <method name="Void MoveNext()">
-        <size>367</size>
+        <size>537</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async21">
       <method name="Void MoveNext()">
-        <size>230</size>
+        <size>235</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async22">
       <method name="Void MoveNext()">
-        <size>334</size>
+        <size>224</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async23">
       <method name="Void MoveNext()">
-        <size>1009</size>
+        <size>211</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async24">
       <method name="Void MoveNext()">
-        <size>738</size>
-      </method>
-      <method name="Int32 &lt;&gt;m__4C()">
-        <size>3</size>
+        <size>368</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async25">
       <method name="Void MoveNext()">
-        <size>212</size>
-      </method>
-      <method name="Int32 &lt;&gt;m__4D()">
-        <size>2</size>
+        <size>273</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
     </type>
     <type name="Tester+&lt;&gt;c__async26">
       <method name="Void MoveNext()">
-        <size>334</size>
+        <size>367</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
         <size>3</size>
       </method>
     </type>
+    <type name="Tester+&lt;&gt;c__async27">
+      <method name="Void MoveNext()">
+        <size>230</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>36</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async28">
+      <method name="Void MoveNext()">
+        <size>334</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>36</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async29">
+      <method name="Void MoveNext()">
+        <size>1009</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>36</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async2A">
+      <method name="Void MoveNext()">
+        <size>738</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>36</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async2B">
+      <method name="Void MoveNext()">
+        <size>212</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>36</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async2C">
+      <method name="Void MoveNext()">
+        <size>334</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>36</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async2D">
+      <method name="Void MoveNext()">
+        <size>232</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>36</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async2E">
+      <method name="Void MoveNext()">
+        <size>420</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>36</size>
+      </method>
+    </type>
+    <type name="Tester">
+      <method name="System.Threading.Tasks.Task`1[System.Boolean] AssignTest_2()">
+        <size>27</size>
+      </method>
+      <method name="System.Threading.Tasks.Task`1[System.Int32] BinaryTest_3()">
+        <size>27</size>
+      </method>
+      <method name="System.Threading.Tasks.Task`1[System.Int32] BinaryTest_4()">
+        <size>27</size>
+      </method>
+      <method name="System.Threading.Tasks.Task`1[System.Boolean] CoalescingTest_1()">
+        <size>27</size>
+      </method>
+      <method name="System.Threading.Tasks.Task`1[System.Boolean] CoalescingTest_2()">
+        <size>27</size>
+      </method>
+      <method name="System.Threading.Tasks.Task`1[System.Boolean] IsTest_2()">
+        <size>27</size>
+      </method>
+      <method name="System.Threading.Tasks.Task`1[System.Boolean] UnaryTest_2()">
+        <size>27</size>
+      </method>
+      <method name="System.Threading.Tasks.Task`1[System.Boolean] UnaryTest_3()">
+        <size>27</size>
+      </method>
+    </type>
     <type name="Tester+&lt;&gt;c__async7">
-      <method name="Int32 &lt;&gt;m__15()">
-        <size>9</size>
+      <method name="Nullable`1 &lt;&gt;m__15()">
+        <size>10</size>
       </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async8">
       <method name="Int32 &lt;&gt;m__16()">
-        <size>3</size>
+        <size>9</size>
       </method>
       <method name="Int32 &lt;&gt;m__17()">
         <size>3</size>
       </method>
-    </type>
-    <type name="Tester+&lt;&gt;c__async8">
-      <method name="Boolean &lt;&gt;m__18()">
-        <size>16</size>
+      <method name="Int32 &lt;&gt;m__18()">
+        <size>3</size>
       </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async9">
       <method name="Boolean &lt;&gt;m__19()">
         <size>16</size>
       </method>
       <method name="Boolean &lt;&gt;m__1A()">
         <size>16</size>
       </method>
+      <method name="Boolean &lt;&gt;m__1B()">
+        <size>16</size>
+      </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async9">
-      <method name="Int32 &lt;&gt;m__1B()">
-        <size>9</size>
+    <type name="Tester+&lt;&gt;c__asyncA">
+      <method name="Nullable`1 &lt;&gt;m__1C()">
+        <size>7</size>
       </method>
-      <method name="Int32 &lt;&gt;m__1C()">
-        <size>3</size>
+      <method name="Nullable`1 &lt;&gt;m__1D()">
+        <size>10</size>
+      </method>
+      <method name="Nullable`1 &lt;&gt;m__1E()">
+        <size>10</size>
+      </method>
+      <method name="Nullable`1 &lt;&gt;m__1F()">
+        <size>7</size>
+      </method>
+      <method name="Nullable`1 &lt;&gt;m__20()">
+        <size>10</size>
+      </method>
+      <method name="Nullable`1 &lt;&gt;m__21()">
+        <size>7</size>
       </method>
     </type>
     <type name="Tester+&lt;&gt;c__asyncB">
-      <method name="Int32 &lt;&gt;m__1F()">
-        <size>3</size>
+      <method name="Nullable`1 &lt;&gt;m__22()">
+        <size>7</size>
+      </method>
+      <method name="Nullable`1 &lt;&gt;m__23()">
+        <size>10</size>
+      </method>
+      <method name="Nullable`1 &lt;&gt;m__24()">
+        <size>13</size>
+      </method>
+      <method name="Nullable`1 &lt;&gt;m__25()">
+        <size>10</size>
       </method>
     </type>
     <type name="Tester+&lt;&gt;c__asyncC">
-      <method name="E &lt;&gt;m__20()">
+      <method name="Int32 &lt;&gt;m__26()">
+        <size>9</size>
+      </method>
+      <method name="Int32 &lt;&gt;m__27()">
+        <size>3</size>
+      </method>
+      <method name="Int32 &lt;&gt;m__28()">
         <size>2</size>
       </method>
     </type>
     <type name="Tester+&lt;&gt;c__asyncD">
-      <method name="Int32 &lt;&gt;m__21()">
-        <size>18</size>
+      <method name="Int32 &lt;&gt;m__29()">
+        <size>9</size>
       </method>
     </type>
     <type name="Tester+&lt;&gt;c__asyncE">
-      <method name="Decimal &lt;&gt;m__22()">
-        <size>8</size>
+      <method name="Int32 &lt;&gt;m__2A()">
+        <size>3</size>
       </method>
     </type>
     <type name="Tester+&lt;&gt;c__asyncF">
-      <method name="Tester &lt;&gt;m__23()">
-        <size>7</size>
+      <method name="E &lt;&gt;m__2B()">
+        <size>2</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async10">
+      <method name="Int32 &lt;&gt;m__2C()">
+        <size>18</size>
       </method>
     </type>
     <type name="Tester+&lt;&gt;c__async11">
-      <method name="Int32 &lt;&gt;m__24()">
+      <method name="Decimal &lt;&gt;m__2D()">
+        <size>8</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async12">
+      <method name="Tester &lt;&gt;m__2E()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async13">
+      <method name="System.String &lt;&gt;m__2F()">
         <size>2</size>
       </method>
-      <method name="Int32 &lt;&gt;m__25()">
+      <method name="System.String &lt;&gt;m__30()">
+        <size>6</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async14">
+      <method name="Nullable`1 &lt;&gt;m__31()">
+        <size>10</size>
+      </method>
+      <method name="Byte &lt;&gt;m__32()">
         <size>2</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async12">
-      <method name="Boolean &lt;&gt;m__26()">
+    <type name="Tester+&lt;&gt;c__async16">
+      <method name="Int32 &lt;&gt;m__33()">
         <size>2</size>
       </method>
-      <method name="Int32 &lt;&gt;m__27()">
+      <method name="Int32 &lt;&gt;m__34()">
         <size>2</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async13">
-      <method name="Int32 &lt;&gt;m__28()">
+    <type name="Tester+&lt;&gt;c__async17">
+      <method name="Boolean &lt;&gt;m__35()">
+        <size>2</size>
+      </method>
+      <method name="Int32 &lt;&gt;m__36()">
         <size>2</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async14">
-      <method name="Int32 &lt;&gt;m__29(Int32)">
+    <type name="Tester+&lt;&gt;c__async18">
+      <method name="Int32 &lt;&gt;m__37()">
+        <size>2</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async19">
+      <method name="Int32 &lt;&gt;m__38(Int32)">
         <size>4</size>
       </method>
-      <method name="Int32 &lt;&gt;m__2A()">
+      <method name="Int32 &lt;&gt;m__39()">
         <size>2</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async15">
-      <method name="System.Action &lt;&gt;m__2B()">
+    <type name="Tester+&lt;&gt;c__async1A">
+      <method name="System.Action &lt;&gt;m__3A()">
         <size>15</size>
       </method>
-      <method name="Void &lt;&gt;m__2C()">
+      <method name="Void &lt;&gt;m__3B()">
         <size>8</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async16">
-      <method name="Int32 &lt;&gt;m__2D()">
+    <type name="Tester+&lt;&gt;c__async1B">
+      <method name="Int32 &lt;&gt;m__3C()">
         <size>2</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async17">
-      <method name="Int32 &lt;&gt;m__2E()">
+    <type name="Tester+&lt;&gt;c__async1C">
+      <method name="Int32 &lt;&gt;m__3D()">
         <size>2</size>
       </method>
-      <method name="Int32 &lt;&gt;m__2F()">
+      <method name="Int32 &lt;&gt;m__3E()">
         <size>2</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async18">
-      <method name="Int32 &lt;&gt;m__30()">
+    <type name="Tester+&lt;&gt;c__async1D">
+      <method name="Int32 &lt;&gt;m__3F()">
         <size>18</size>
       </method>
-      <method name="Int32 &lt;&gt;m__31()">
+      <method name="Int32 &lt;&gt;m__40()">
         <size>2</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async19">
-      <method name="Int32 &lt;&gt;m__32()">
+    <type name="Tester+&lt;&gt;c__async1E">
+      <method name="Int32 &lt;&gt;m__41()">
         <size>18</size>
       </method>
-      <method name="Int32 &lt;&gt;m__33()">
+      <method name="Int32 &lt;&gt;m__42()">
         <size>3</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async1A">
-      <method name="Int32 &lt;&gt;m__34()">
+    <type name="Tester+&lt;&gt;c__async1F">
+      <method name="Int32 &lt;&gt;m__43()">
         <size>18</size>
       </method>
-      <method name="Int32 &lt;&gt;m__35()">
+      <method name="Int32 &lt;&gt;m__44()">
         <size>3</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async1B">
-      <method name="Int32 &lt;&gt;m__36()">
+    <type name="Tester+&lt;&gt;c__async20">
+      <method name="Int32 &lt;&gt;m__45()">
         <size>3</size>
       </method>
-      <method name="Int32 &lt;&gt;m__37()">
+      <method name="Int32 &lt;&gt;m__46()">
         <size>2</size>
       </method>
+      <method name="Int32 &lt;&gt;m__47()">
+        <size>3</size>
+      </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async1C">
-      <method name="Int32 &lt;&gt;m__39()">
+    <type name="Tester+&lt;&gt;c__async21">
+      <method name="Int32 &lt;&gt;m__48()">
         <size>18</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async1D">
-      <method name="Tester &lt;&gt;m__3A()">
+    <type name="Tester+&lt;&gt;c__async22">
+      <method name="Tester &lt;&gt;m__49()">
         <size>6</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async1E">
-      <method name="Base &lt;&gt;m__3B()">
+    <type name="Tester+&lt;&gt;c__async23">
+      <method name="Nullable`1 &lt;&gt;m__4A()">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async24">
+      <method name="Base &lt;&gt;m__4B()">
         <size>6</size>
       </method>
-      <method name="Base &lt;&gt;m__3C()">
+      <method name="Base &lt;&gt;m__4C()">
         <size>6</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async1F">
-      <method name="Base &lt;&gt;m__3D()">
+    <type name="Tester+&lt;&gt;c__async25">
+      <method name="Base &lt;&gt;m__4D()">
         <size>6</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async20">
-      <method name="Base &lt;&gt;m__3E()">
+    <type name="Tester+&lt;&gt;c__async26">
+      <method name="Base &lt;&gt;m__4E()">
         <size>6</size>
       </method>
-      <method name="Base &lt;&gt;m__3F()">
+      <method name="Base &lt;&gt;m__4F()">
         <size>6</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async21">
-      <method name="Int32 &lt;&gt;m__40()">
+    <type name="Tester+&lt;&gt;c__async27">
+      <method name="Int32 &lt;&gt;m__50()">
         <size>3</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async22">
-      <method name="Int32 &lt;&gt;m__41()">
+    <type name="Tester+&lt;&gt;c__async28">
+      <method name="Int32 &lt;&gt;m__51()">
         <size>3</size>
       </method>
-      <method name="System.String &lt;&gt;m__42()">
+      <method name="System.String &lt;&gt;m__52()">
         <size>6</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async23">
-      <method name="Int32 &lt;&gt;m__43()">
+    <type name="Tester+&lt;&gt;c__async29">
+      <method name="Int32 &lt;&gt;m__53()">
         <size>3</size>
       </method>
-      <method name="Int32 &lt;&gt;m__44()">
+      <method name="Int32 &lt;&gt;m__54()">
         <size>3</size>
       </method>
-      <method name="Int32 &lt;&gt;m__45()">
+      <method name="Int32 &lt;&gt;m__55()">
         <size>3</size>
       </method>
-      <method name="Int32 &lt;&gt;m__46()">
+      <method name="Int32 &lt;&gt;m__56()">
         <size>3</size>
       </method>
-      <method name="Int32 &lt;&gt;m__47()">
+      <method name="Int32 &lt;&gt;m__57()">
         <size>3</size>
       </method>
-      <method name="Int32 &lt;&gt;m__48()">
+      <method name="Int32 &lt;&gt;m__58()">
         <size>3</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async24">
-      <method name="System.String &lt;&gt;m__49()">
+    <type name="Tester+&lt;&gt;c__async2A">
+      <method name="System.String &lt;&gt;m__59()">
         <size>6</size>
       </method>
-      <method name="System.String &lt;&gt;m__4A()">
+      <method name="System.String &lt;&gt;m__5A()">
         <size>6</size>
       </method>
-      <method name="Int32 &lt;&gt;m__4B()">
+      <method name="Int32 &lt;&gt;m__5B()">
         <size>3</size>
       </method>
-    </type>
-    <type name="Tester+&lt;&gt;c__async26">
-      <method name="Int32 &lt;&gt;m__4E()">
-        <size>2</size>
+      <method name="Int32 &lt;&gt;m__5C()">
+        <size>3</size>
       </method>
-      <method name="Int32 &lt;&gt;m__4F()">
+    </type>
+    <type name="Tester+&lt;&gt;c__async2B">
+      <method name="Int32 &lt;&gt;m__5D()">
         <size>2</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async27">
-      <method name="Void MoveNext()">
-        <size>232</size>
-      </method>
-      <method name="Byte &lt;&gt;m__50()">
+    <type name="Tester+&lt;&gt;c__async2C">
+      <method name="Int32 &lt;&gt;m__5E()">
         <size>2</size>
       </method>
-      <method name="Void .ctor()">
-        <size>36</size>
+      <method name="Int32 &lt;&gt;m__5F()">
+        <size>2</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async28">
-      <method name="Void MoveNext()">
-        <size>420</size>
-      </method>
-      <method name="UInt16 &lt;&gt;m__51()">
+    <type name="Tester+&lt;&gt;c__async2D">
+      <method name="Byte &lt;&gt;m__60()">
         <size>2</size>
       </method>
-      <method name="UInt16 &lt;&gt;m__52()">
+    </type>
+    <type name="Tester+&lt;&gt;c__async2E">
+      <method name="UInt16 &lt;&gt;m__61()">
         <size>2</size>
       </method>
-      <method name="Void .ctor()">
-        <size>36</size>
+      <method name="UInt16 &lt;&gt;m__62()">
+        <size>2</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async29">
+    <type name="Tester+&lt;&gt;c__async2F">
       <method name="Void MoveNext()">
         <size>250</size>
       </method>
-      <method name="S &lt;&gt;m__53()">
+      <method name="S &lt;&gt;m__63()">
         <size>18</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async2A">
+    <type name="Tester+&lt;&gt;c__async30">
       <method name="Void MoveNext()">
         <size>201</size>
       </method>
-      <method name="Int32 &lt;&gt;m__54()">
+      <method name="Int32 &lt;&gt;m__64()">
         <size>2</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async2B">
+    <type name="Tester+&lt;&gt;c__async31">
       <method name="Void MoveNext()">
         <size>272</size>
       </method>
-      <method name="Int32 &lt;&gt;m__55()">
+      <method name="Int32 &lt;&gt;m__65()">
         <size>2</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async2C">
+    <type name="Tester+&lt;&gt;c__async32">
       <method name="Void MoveNext()">
         <size>636</size>
       </method>
-      <method name="Int32 &lt;&gt;m__56()">
+      <method name="Int32 &lt;&gt;m__66()">
         <size>3</size>
       </method>
-      <method name="Int32 &lt;&gt;m__57()">
+      <method name="Int32 &lt;&gt;m__67()">
         <size>2</size>
       </method>
-      <method name="Int32 &lt;&gt;m__58()">
+      <method name="Int32 &lt;&gt;m__68()">
         <size>2</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async2D">
+    <type name="Tester+&lt;&gt;c__async33">
       <method name="Void MoveNext()">
         <size>441</size>
       </method>
-      <method name="System.String &lt;&gt;m__59()">
+      <method name="System.String &lt;&gt;m__69()">
         <size>6</size>
       </method>
-      <method name="System.String &lt;&gt;m__5A()">
+      <method name="System.String &lt;&gt;m__6A()">
         <size>6</size>
       </method>
-      <method name="System.String &lt;&gt;m__5B()">
+      <method name="System.String &lt;&gt;m__6B()">
         <size>2</size>
       </method>
       <method name="Void .ctor()">
         <size>36</size>
       </method>
     </type>
-    <type name="Tester+&lt;&gt;c__async2E">
+    <type name="Tester+&lt;&gt;c__async34">
       <method name="Void MoveNext()">
         <size>212</size>
       </method>
-      <method name="Int32 &lt;&gt;m__5C()">
+      <method name="Int32 &lt;&gt;m__6C()">
+        <size>2</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>36</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async35">
+      <method name="Void MoveNext()">
+        <size>285</size>
+      </method>
+      <method name="Nullable`1 &lt;&gt;m__6D()">
+        <size>7</size>
+      </method>
+      <method name="Void .ctor()">
+        <size>36</size>
+      </method>
+    </type>
+    <type name="Tester+&lt;&gt;c__async36">
+      <method name="Void MoveNext()">
+        <size>364</size>
+      </method>
+      <method name="Int32 &lt;&gt;m__6E()">
         <size>2</size>
       </method>
       <method name="Void .ctor()">