[mcs] Release array stack variable once all elements are initialized. Fixes #17942
authorMarek Safar <marek.safar@gmail.com>
Mon, 24 Feb 2014 14:50:20 +0000 (15:50 +0100)
committerMarek Safar <marek.safar@gmail.com>
Mon, 24 Feb 2014 15:01:21 +0000 (16:01 +0100)
mcs/mcs/async.cs
mcs/mcs/expression.cs
mcs/tests/test-async-60.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_5.xml

index 262519893c48d19764dfc2f8710b07f94b50ecb4..2a339b41b5f67b604033f3709c9d72469ec69f16 100644 (file)
@@ -959,15 +959,19 @@ namespace Mono.CSharp
 
                public override void Emit (EmitContext ec)
                {
-                       EmitWithCleanup (ec, true);
+                       base.Emit (ec);
+
+                       PrepareCleanup (ec);
                }
 
-               public void EmitWithCleanup (EmitContext ec, bool release)
+               public void EmitLoad (EmitContext ec)
                {
                        base.Emit (ec);
+               }
 
-                       if (release)
-                               IsAvailableForReuse = true;
+               public void PrepareCleanup (EmitContext ec)
+               {
+                       IsAvailableForReuse = true;
 
                        //
                        // Release any captured reference type stack variables
index 9b8240d0e82776ca85961ee854536de1d6a05d9e..59c1887a3b8ddc4e86bc692512bf051c39cbae84 100644 (file)
@@ -7492,7 +7492,7 @@ namespace Mono.CSharp
                                                        e = e.EmitToField (ec);
                                                }
 
-                                               stackArray.EmitWithCleanup (ec, false);
+                                               stackArray.EmitLoad (ec);
                                        } else {
                                                ec.Emit (OpCodes.Dup);
                                        }
@@ -7542,7 +7542,7 @@ namespace Mono.CSharp
                        }
 
                        if (stackArray != null)
-                               stackArray.IsAvailableForReuse = true;
+                               stackArray.PrepareCleanup (ec);
                }
 
                public override void Emit (EmitContext ec)
diff --git a/mcs/tests/test-async-60.cs b/mcs/tests/test-async-60.cs
new file mode 100644 (file)
index 0000000..8973324
--- /dev/null
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+class C : B
+{
+}
+
+class B
+{
+}
+
+class X
+{
+       public static void Main ()
+       {
+               var x = new X ();
+               x.AlignTwoItems ().Wait ();
+       }
+
+       public async Task AlignTwoItems ()
+       {
+               var items = new [] {
+                       (C) await AddItemAt (20, 20),
+                       (C) await AddItemAt (40, 40)
+               };
+               await MoveItemBy (items, 1, 1);
+
+               Console.WriteLine ((C) items [0]);
+               Console.WriteLine ((C) items [1]);
+       }
+
+       Task MoveItemBy (object o, int a, int b)
+       {
+               return Task.FromResult (2);
+       }
+
+       async Task<B> AddItemAt (int a, int b)
+       {
+               return new C ();
+       }
+}
\ No newline at end of file
index 587d1bab4662c40df863c66f481d92f310b2ebbc..64e54e473562b839deebd3d629b9dd837c1c1808 100644 (file)
       </method>\r
     </type>\r
   </test>\r
+  <test name="test-async-60.cs">\r
+    <type name="C">\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="B">\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="X">\r
+      <method name="Void Main()" attrs="150">\r
+        <size>19</size>\r
+      </method>\r
+      <method name="System.Threading.Tasks.Task AlignTwoItems()" attrs="134">\r
+        <size>41</size>\r
+      </method>\r
+      <method name="System.Threading.Tasks.Task MoveItemBy(System.Object, Int32, Int32)" attrs="129">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="System.Threading.Tasks.Task`1[B] AddItemAt(Int32, Int32)" attrs="129">\r
+        <size>33</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="X+&lt;AlignTwoItems&gt;c__async0">\r
+      <method name="Void MoveNext()" attrs="486">\r
+        <size>469</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="X+&lt;AddItemAt&gt;c__async1">\r
+      <method name="Void MoveNext()" attrs="486">\r
+        <size>43</size>\r
+      </method>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="test-cls-00.cs">\r
     <type name="CLSCLass_6">\r
       <method name="Void add_Disposed(Delegate)" attrs="2182">\r