[mcs] Don't reset temporary stack fields too early. Fixes #43265
[mono.git] / mcs / mcs / async.cs
index b3efae3241024e39237558fbf7b0634d32f8a761..39d114fd451cb516dca4d5a8e9679e07ecf6a2ff 100644 (file)
@@ -973,14 +973,17 @@ namespace Mono.CSharp
                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;
                        }
@@ -990,7 +993,7 @@ namespace Mono.CSharp
                {
                        base.AddressOf (ec, mode);
 
-                       if (mode == AddressOp.Load) {
+                       if (mode == AddressOp.Load && AutomaticallyReuse) {
                                IsAvailableForReuse = true;
                        }
                }
@@ -999,7 +1002,8 @@ namespace Mono.CSharp
                {
                        base.Emit (ec);
 
-                       PrepareCleanup (ec);
+                       if (AutomaticallyReuse)
+                               PrepareCleanup (ec);
                }
 
                public void EmitLoad (EmitContext ec)