[mcs] Emit correct attribute reference when async lambda ends up in nested type....
authorMarek Safar <marek.safar@gmail.com>
Thu, 26 Jun 2014 14:49:09 +0000 (16:49 +0200)
committerMarek Safar <marek.safar@gmail.com>
Thu, 26 Jun 2014 15:20:29 +0000 (17:20 +0200)
mcs/mcs/method.cs
mcs/tests/test-async-35.cs
mcs/tests/ver-il-net_4_5.xml

index c29ce97bea687209ccf5e37d289805ec674dbec9..32d76fbc8c8b0c9ee16d8cd41726cd3ee96a3fab 100644 (file)
@@ -725,6 +725,11 @@ namespace Mono.CSharp {
                        if (MethodData != null)
                                MethodData.Emit (Parent);
 
+                       if (block != null && block.StateMachine is AsyncTaskStorey) {
+                               var psm = Module.PredefinedAttributes.AsyncStateMachine;
+                               psm.EmitAttribute (MethodBuilder, block.StateMachine);
+                       }
+
                        if ((ModFlags & Modifiers.PARTIAL) == 0)
                                Block = null;
                }
@@ -1349,12 +1354,6 @@ namespace Mono.CSharp {
                                        }
                                }
 
-                               if (block != null && block.StateMachine is AsyncTaskStorey) {
-                                       var psm = Module.PredefinedAttributes.AsyncStateMachine;
-                                       
-                                       psm.EmitAttribute (MethodBuilder, block.StateMachine);
-                               }
-
                                if ((ModFlags & Modifiers.METHOD_EXTENSION) != 0)
                                        Module.PredefinedAttributes.Extension.EmitAttribute (MethodBuilder);
 
index 5b2cadb227447d463e9707739515cd0344f72504..e04a810ebceed00ddd87d14c43e48053a821fe4a 100644 (file)
@@ -14,6 +14,15 @@ namespace N.M
                        return 0;
                }
 
+               public static async Task NestedAsyncAnonymousMethod ()
+               {
+                       Action a = async delegate {
+                               await Task.Yield();
+                       };
+
+                       await Task.Yield();
+               }
+
                public static int Main ()
                {
                        var m = typeof (C).GetMethod ("AsyncMethod");
@@ -32,6 +41,28 @@ namespace N.M
                        if (c != 1)
                                return 3;
 
+
+                       m = typeof (C).GetMethod ("NestedAsyncAnonymousMethod");
+                       attr = m.GetCustomAttribute<AsyncStateMachineAttribute> ();
+                       if (attr == null)
+                               return 10;
+
+                       if (attr.StateMachineType == null)
+                               return 11;
+
+                       var n = typeof (C).GetNestedTypes (BindingFlags.NonPublic).Single (l => l.Name.Contains ("NestedAsyncAnonymousMethod"));
+                       if (n == null)
+                               return 12;
+
+                       m = n.GetMethods (BindingFlags.NonPublic | BindingFlags.Static).Single (l => l.Name.Contains ("m__"));
+
+                       attr = m.GetCustomAttribute<AsyncStateMachineAttribute> ();
+                       if (attr == null)
+                               return 13;
+
+                       if (attr.StateMachineType == null)
+                               return 14;
+
                        return 0;
                }
        }
index 902a9be637d1e1334d23f629ea2cae333b94da70..df81b91072921e9f88abe4b385ef15238b44ca8d 100644 (file)
         <size>33</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
-        <size>178</size>\r
+        <size>409</size>\r
       </method>\r
       <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__0()" attrs="145">\r
         <size>33</size>\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>165</size>\r
       </method>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
     </type>\r
-    <type name="N.M.C+&lt;Main&gt;c__async1">\r
+    <type name="N.M.C">\r
+      <method name="System.Threading.Tasks.Task NestedAsyncAnonymousMethod()" attrs="150">\r
+        <size>33</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__2(System.Type)" attrs="145">\r
+        <size>24</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__3(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>24</size>\r
+      </method>\r
+    </type>\r
+    <type name="N.M.C+&lt;NestedAsyncAnonymousMethod&gt;c__async1">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>162</size>\r
+        <size>194</size>\r
+      </method>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>27</size>\r
       </method>\r
     </type>\r
-    <type name="N.M.C+&lt;AsyncMethod&gt;c__async0">\r
+    <type name="N.M.C+&lt;NestedAsyncAnonymousMethod&gt;c__async1+&lt;NestedAsyncAnonymousMethod&gt;c__async2">\r
+      <method name="Void MoveNext()" attrs="486">\r
+        <size>159</size>\r
+      </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
     </type>\r
-    <type name="N.M.C+&lt;Main&gt;c__async1">\r
+    <type name="N.M.C+&lt;Main&gt;c__async3">\r
+      <method name="Void MoveNext()" attrs="486">\r
+        <size>162</size>\r
+      </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r