refactoring
authorJb Evain <jbevain@gmail.com>
Tue, 27 May 2008 13:40:52 +0000 (13:40 -0000)
committerJb Evain <jbevain@gmail.com>
Tue, 27 May 2008 13:40:52 +0000 (13:40 -0000)
svn path=/trunk/mcs/; revision=104141

mcs/class/System.Core/System.Linq.Expressions/EmitContext.cs
mcs/class/System.Core/System.Linq.Expressions/MemberExpression.cs
mcs/class/System.Core/System.Linq.Expressions/UnaryExpression.cs

index 6b4992c4cb5fdd7e9233569de62be7d5e5f8ce2d..c5b8a52e93268c3bec49fa1b1333716dd73349e4 100644 (file)
@@ -101,13 +101,34 @@ namespace System.Linq.Expressions {
                        return local;
                }
 
-               public void EmitLoad (Expression expression)
+               public void EmitLoadAddress (Expression expression)
+               {
+                       ig.Emit (OpCodes.Ldloca, EmitStored (expression));
+               }
+
+               public void EmitLoadSubject (Expression expression)
                {
                        if (expression.Type.IsValueType) {
-                               var local = EmitStored (expression);
-                               ig.Emit (OpCodes.Ldloca, local);
-                       } else
-                               expression.Emit (this);
+                               EmitLoadAddress (expression);
+                               return;
+                       }
+
+                       Emit (expression);
+               }
+
+               public void EmitLoadSubject (LocalBuilder local)
+               {
+                       if (local.LocalType.IsValueType) {
+                               EmitLoadAddress (local);
+                               return;
+                       }
+
+                       EmitLoad (local);
+               }
+
+               public void EmitLoadAddress (LocalBuilder local)
+               {
+                       ig.Emit (OpCodes.Ldloca, local);
                }
 
                public void EmitLoad (LocalBuilder local)
@@ -117,15 +138,21 @@ namespace System.Linq.Expressions {
 
                public void EmitCall (LocalBuilder local, ReadOnlyCollection<Expression> arguments, MethodInfo method)
                {
-                       EmitLoad (local);
+                       EmitLoadSubject (local);
                        EmitArguments (method, arguments);
                        EmitCall (method);
                }
 
+               public void EmitCall (LocalBuilder local, MethodInfo method)
+               {
+                       EmitLoadSubject (local);
+                       EmitCall (method);
+               }
+
                public void EmitCall (Expression expression, MethodInfo method)
                {
                        if (!method.IsStatic)
-                               EmitLoad (expression);
+                               EmitLoadSubject (expression);
 
                        EmitCall (method);
                }
@@ -133,7 +160,7 @@ namespace System.Linq.Expressions {
                public void EmitCall (Expression expression, ReadOnlyCollection<Expression> arguments, MethodInfo method)
                {
                        if (!method.IsStatic)
-                               EmitLoad (expression);
+                               EmitLoadSubject (expression);
 
                        EmitArguments (method, arguments);
                        EmitCall (method);
index 31b46cc0903dd3c79368677fc0fd00da44485fd6..91a6aa0c1a89ad75063005ef90d80a580be4bdaa 100644 (file)
@@ -63,7 +63,7 @@ namespace System.Linq.Expressions {
                {
                        var getter = property.GetGetMethod (true);
                        if (!getter.IsStatic)
-                               ec.EmitLoad (expression);
+                               ec.EmitLoadSubject (expression);
 
                        ec.EmitCall (getter);
                }
@@ -71,7 +71,7 @@ namespace System.Linq.Expressions {
                void EmitFieldAccess (EmitContext ec, FieldInfo field)
                {
                        if (!field.IsStatic) {
-                               ec.EmitLoad (expression);
+                               ec.EmitLoadSubject (expression);
                                ec.ig.Emit (OpCodes.Ldfld, field);
                        } else
                                ec.ig.Emit (OpCodes.Ldsfld, field);
index f19344ee1b66e503302144c9672140c1e694c5db..e5559d5939c4369fdd9d1a5573127351d23f7018 100644 (file)
@@ -143,8 +143,7 @@ namespace System.Linq.Expressions {
                        var has_value = ig.DefineLabel ();
                        var done = ig.DefineLabel ();
 
-                       ig.Emit (OpCodes.Ldloca, from);
-                       ig.Emit (OpCodes.Call, from.LocalType.GetMethod ("get_HasValue"));
+                       ec.EmitCall (from, from.LocalType.GetMethod ("get_HasValue"));
                        ig.Emit (OpCodes.Brtrue, has_value);
 
                        // if not has value
@@ -156,8 +155,7 @@ namespace System.Linq.Expressions {
 
                        ig.MarkLabel (has_value);
                        // if has value
-                       ig.Emit (OpCodes.Ldloca, from);
-                       ig.Emit (OpCodes.Call, from.LocalType.GetMethod ("GetValueOrDefault", Type.EmptyTypes));
+                       ec.EmitCall (from, from.LocalType.GetMethod ("GetValueOrDefault", Type.EmptyTypes));
                        ig.Emit (OpCodes.Newobj, to.LocalType.GetConstructor (
                                new [] { GetNotNullableOf (to.LocalType) }));