2008-05-05 Marek Safar <marek.safar@gmail.com>
authorMarek Safar <marek.safar@gmail.com>
Mon, 5 May 2008 17:44:38 +0000 (17:44 -0000)
committerMarek Safar <marek.safar@gmail.com>
Mon, 5 May 2008 17:44:38 +0000 (17:44 -0000)
* nullable.cs, statement.cs (Unwrap): Store non-variable expression in all
nullable operations.

svn path=/trunk/mcs/; revision=102552

mcs/mcs/ChangeLog
mcs/mcs/nullable.cs
mcs/mcs/statement.cs

index f9e7184b2c4e49200dbbd053d7c24a9f033a4a11..2d001b98121f4714a526029c9c129d21675079be 100644 (file)
@@ -1,3 +1,8 @@
+2008-05-05  Marek Safar  <marek.safar@gmail.com>
+
+       * nullable.cs, statement.cs (Unwrap): Store non-variable expression in all
+       nullable operations.
+
 2008-05-04  Marek Safar  <marek.safar@gmail.com>
 
        * nullable.cs, statement.cs (Unwrap): Don't duplicate variable expressions,
index e27968b7f0e68ba0531c68d5cfa7bcee7ffdd953..0f11bfe11ae7d1f8b6347154e9d6e9014082b9f5 100644 (file)
@@ -122,18 +122,21 @@ namespace Mono.CSharp.Nullable
 
                public override void Emit (EmitContext ec)
                {
+                       Store (ec);
                        AddressOf (ec, AddressOp.LoadStore);
                        ec.ig.EmitCall (OpCodes.Call, info.Value, null);
                }
 
                public void EmitCheck (EmitContext ec)
                {
+                       Store (ec);
                        AddressOf (ec, AddressOp.LoadStore);
                        ec.ig.EmitCall (OpCodes.Call, info.HasValue, null);
                }
 
                public void EmitGetValueOrDefault (EmitContext ec)
                {
+                       Store (ec);
                        AddressOf (ec, AddressOp.LoadStore);
                        ec.ig.EmitCall (OpCodes.Call, info.GetValueOrDefault, null);
                }
@@ -161,11 +164,14 @@ namespace Mono.CSharp.Nullable
                        }
                }
 
-               public void Store (EmitContext ec)
+               void Store (EmitContext ec)
                {
                        if (expr is VariableReference)
                                return;
 
+                       if (temp != null)
+                               return;
+
                        expr.Emit (ec);
                        LocalVariable.Store (ec);
                }
@@ -747,15 +753,11 @@ namespace Mono.CSharp.Nullable
 
                public override void Emit (EmitContext ec)
                {
-                       if (left_unwrap != null)
-                               left_unwrap.Store (ec);
-
-                       if (right_unwrap != null) {
-                               if (right.Equals (left))
-                                       right_unwrap = left_unwrap;
-                               else
-                                       right_unwrap.Store (ec);
-                       }
+                       //
+                       // Optimize same expression operation
+                       //
+                       if (right_unwrap != null && right.Equals (left))
+                               right_unwrap = left_unwrap;
 
                        if (user_operator == null && IsBitwiseBoolean) {
                                EmitBitwiseBoolean (ec);
@@ -1126,7 +1128,6 @@ namespace Mono.CSharp.Nullable
                        Label is_null_label = ig.DefineLabel ();
                        Label end_label = ig.DefineLabel ();
 
-                       unwrap.Store (ec);
                        unwrap.EmitCheck (ec);
                        ig.Emit (OpCodes.Brfalse, is_null_label);
 
index 5978b11426b9d8c29e8c439d593046ec6e929ca2..72b3a610170f33ffe384e0f6d774bad21997d26c 100644 (file)
@@ -3712,7 +3712,6 @@ namespace Mono.CSharp {
                        if (HaveUnwrap) {
                                value = ig.DeclareLocal (SwitchType);
 #if GMCS_SOURCE
-                               unwrap.Store (ec);
                                unwrap.EmitCheck (ec);
                                ig.Emit (OpCodes.Brfalse, null_target);
                                new_expr.Emit (ec);