stmt.EmitStatement (ec);
}
- public override void MarkReachable (Reachability rc)
+ public override Reachability MarkReachable (Reachability rc)
{
- base.MarkReachable (rc);
- stmt.MarkReachable (rc);
+ return stmt.MarkReachable (rc);
}
public override object Accept (StructuralVisitor visitor)
ec.Emit (OpCodes.Ret);
}
- public override void MarkReachable (Reachability rc)
+ public override Reachability MarkReachable (Reachability rc)
{
//
// Reachability has been done in AsyncInitializerStatement
//
+ return rc;
}
}
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)