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
e = e.EmitToField (ec);
}
- stackArray.EmitWithCleanup (ec, false);
+ stackArray.EmitLoad (ec);
} else {
ec.Emit (OpCodes.Dup);
}
}
if (stackArray != null)
- stackArray.IsAvailableForReuse = true;
+ stackArray.PrepareCleanup (ec);
}
public override void Emit (EmitContext ec)
--- /dev/null
+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
</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+<AlignTwoItems>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+<AddItemAt>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