codeowners update
[mono.git] / mcs / mcs / expression.cs
index b9f47b5a361054a9b3675508668144a484c51de8..113ed29910c155493a769098bc9e058a05712a96 100644 (file)
@@ -1687,8 +1687,15 @@ namespace Mono.CSharp
                                ec.Emit (OpCodes.Dup);
                                no_value_label = ec.DefineLabel ();
                                ec.Emit (OpCodes.Brfalse_S, no_value_label);
+
+                               if (Variable.HoistedVariant != null)
+                                       ec.EmitThis ();
+
                                expr_unwrap.Emit (ec);
                        } else {
+                               if (Variable?.HoistedVariant != null)
+                                       ec.EmitThis ();
+
                                expr.Emit (ec);
 
                                // Only to make verifier happy
@@ -1708,19 +1715,29 @@ namespace Mono.CSharp
                                        value_on_stack = false;
                                }
 
-                               //
-                               // It's ok to have variable builder create out of order. It simplified emit
-                               // of statements like while (condition) { }
-                               //
-                               if (!Variable.Created)
-                                       Variable.CreateBuilder (ec);
-                               
-                               Variable.EmitAssign (ec);
+                               if (Variable.HoistedVariant != null) {
+                                       Variable.HoistedVariant.EmitAssignFromStack (ec);
 
-                               if (expr_unwrap != null) {
-                                       ec.MarkLabel (no_value_label);
-                               } else if (!value_on_stack) {
-                                       Variable.Emit (ec);
+                                       if (expr_unwrap != null) {
+                                               ec.MarkLabel (no_value_label);
+                                       } else if (!value_on_stack) {
+                                               Variable.HoistedVariant.Emit (ec);
+                                       }
+                               } else {
+                                       //
+                                       // It's ok to have variable builder created out of order. It simplifies emit
+                                       // of statements like while (condition) { }
+                                       //
+                                       if (!Variable.Created)
+                                               Variable.CreateBuilder (ec);
+
+                                       Variable.EmitAssign (ec);
+
+                                       if (expr_unwrap != null) {
+                                               ec.MarkLabel (no_value_label);
+                                       } else if (!value_on_stack) {
+                                               Variable.Emit (ec);
+                                       }
                                }
                        }
                }
@@ -2599,7 +2616,8 @@ namespace Mono.CSharp
 
                public void AddressOf (EmitContext ec, AddressOp mode)
                {
-                       Variable.CreateBuilder (ec);
+                       if (!Variable.Created)
+                               Variable.CreateBuilder (ec);
 
                        if (Initializer != null) {
                                lvr.EmitAssign (ec, Initializer, false, false);
@@ -2672,6 +2690,11 @@ namespace Mono.CSharp
                {
                        throw new NotImplementedException ();
                }
+
+               public override void EmitPrepare (EmitContext ec)
+               {
+                       Variable.CreateBuilder (ec);
+               }
        }
        
        //
@@ -7370,7 +7393,14 @@ namespace Mono.CSharp
                        else
                                mg.EmitCall (ec, arguments, false);
                }
-               
+
+               public override void EmitPrepare (EmitContext ec)
+               {
+                       mg.EmitPrepare (ec);
+
+                       arguments?.EmitPrepare (ec);
+               }
+
                public override void EmitStatement (EmitContext ec)
                {
                        if (mg.IsConditionallyExcluded)