public StackFieldExpr (Field field)
: base (field, Location.Null)
{
+ AutomaticallyReuse = true;
}
+ public bool AutomaticallyReuse { get; set; }
+
public bool IsAvailableForReuse {
get {
var field = (Field) spec.MemberDefinition;
return field.IsAvailableForReuse;
}
- set {
+ private set {
var field = (Field) spec.MemberDefinition;
field.IsAvailableForReuse = value;
}
{
base.AddressOf (ec, mode);
- if (mode == AddressOp.Load) {
+ if (mode == AddressOp.Load && AutomaticallyReuse) {
IsAvailableForReuse = true;
}
}
{
base.Emit (ec);
- PrepareCleanup (ec);
+ if (AutomaticallyReuse)
+ PrepareCleanup (ec);
}
public void EmitLoad (EmitContext ec)
throw new NotImplementedException ();
sf = ec.GetTemporaryField (type);
+ sf.AutomaticallyReuse = false;
sf.EmitAssign (ec, temp, false, false);
temp_target = sf;
temp.Release (ec);
temp.Release (ec);
if (sf != null)
- sf.IsAvailableForReuse = true;
-
+ sf.PrepareCleanup (ec);
+
return true;
}
ec.Emit (OpCodes.Stloc, temp);
var exception_field = ec.GetTemporaryField (type);
+ exception_field.AutomaticallyReuse = false;
ec.EmitThis ();
ec.Emit (OpCodes.Ldloc, temp);
exception_field.EmitAssignFromStack (ec);
ec.Emit (OpCodes.Throw);
ec.MarkLabel (skip_throw);
- exception_field.IsAvailableForReuse = true;
+ exception_field.PrepareCleanup (ec);
EmitUnwindFinallyTable (ec);
}
--- /dev/null
+using System;
+using System.Threading.Tasks;
+
+class CA
+{
+ public CB CB { get; set; }
+ public DeviceDetails DeviceDetails { get; set; }
+}
+
+class CB
+{
+ public CB (string arg)
+ {
+ }
+}
+
+class DeviceDetails
+{
+ public DeviceDetails (string arg)
+ {
+ }
+}
+
+class BB
+{
+ public Task<string> GetUser()
+ {
+ return Task.FromResult ("aa");
+ }
+
+ public Task<string> GetDevice()
+ {
+ return Task.FromResult ("bb");
+ }
+}
+
+class X
+{
+ BB bb = new BB ();
+
+ public async Task<CA> GetCAAsync()
+ {
+ return new CA
+ {
+ CB = new CB(await bb.GetUser()),
+ DeviceDetails = new DeviceDetails(await bb.GetDevice())
+ };
+ }
+
+ static void Main ()
+ {
+ var x = new X ();
+ x.GetCAAsync ().Wait ();
+ }
+}
\ No newline at end of file
</method>
</type>
</test>
+ <test name="test-async-87.cs">
+ <type name="CA">
+ <method name="CB get_CB()" attrs="2182">
+ <size>14</size>
+ </method>
+ <method name="Void set_CB(CB)" attrs="2182">
+ <size>8</size>
+ </method>
+ <method name="DeviceDetails get_DeviceDetails()" attrs="2182">
+ <size>14</size>
+ </method>
+ <method name="Void set_DeviceDetails(DeviceDetails)" attrs="2182">
+ <size>8</size>
+ </method>
+ <method name="Void .ctor()" attrs="6278">
+ <size>7</size>
+ </method>
+ </type>
+ <type name="CB">
+ <method name="Void .ctor(String)" attrs="6278">
+ <size>8</size>
+ </method>
+ </type>
+ <type name="DeviceDetails">
+ <method name="Void .ctor(String)" attrs="6278">
+ <size>8</size>
+ </method>
+ </type>
+ <type name="BB">
+ <method name="System.Threading.Tasks.Task`1[System.String] GetUser()" attrs="134">
+ <size>19</size>
+ </method>
+ <method name="System.Threading.Tasks.Task`1[System.String] GetDevice()" attrs="134">
+ <size>19</size>
+ </method>
+ <method name="Void .ctor()" attrs="6278">
+ <size>7</size>
+ </method>
+ </type>
+ <type name="X">
+ <method name="System.Threading.Tasks.Task`1[CA] GetCAAsync()" attrs="134">
+ <size>41</size>
+ </method>
+ <method name="Void Main()" attrs="145">
+ <size>19</size>
+ </method>
+ <method name="Void .ctor()" attrs="6278">
+ <size>18</size>
+ </method>
+ </type>
+ <type name="X+<GetCAAsync>c__async0">
+ <method name="Void MoveNext()" attrs="486">
+ <size>366</size>
+ </method>
+ <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
+ <size>13</size>
+ </method>
+ </type>
+ </test>
<test name="test-cls-00.cs">
<type name="CLSCLass_6">
<method name="Void add_Disposed(Delegate)" attrs="2182">