Forráskód Böngészése

2008-03-06 Jb Evain <[email protected]>

	* BinaryExpression.cs, Expression.cs: move EmitStored from
	BinaryExpression to Expression.
	* MethodCallExpression.cs: allow method calls on structs.


svn path=/trunk/mcs/; revision=97460
Jb Evain 18 éve
szülő
commit
38047d801d

+ 0 - 9
mcs/class/System.Core/System.Linq.Expressions/BinaryExpression.cs

@@ -114,15 +114,6 @@ namespace System.Linq.Expressions {
 			return method;
 		}
 
-		LocalBuilder EmitStored (EmitContext ec, Expression expr)
-		{
-			var local = ec.ig.DeclareLocal (expr.Type);
-			expr.Emit (ec);
-			ec.ig.Emit (OpCodes.Stloc, local);
-
-			return local;
-		}
-
 		void EmitLiftedLogical (EmitContext ec, bool and, bool short_circuit)
 		{
 			var ig = ec.ig;

+ 6 - 0
mcs/class/System.Core/System.Linq.Expressions/ChangeLog

@@ -1,3 +1,9 @@
+2008-03-06  Jb Evain  <[email protected]>
+
+	* BinaryExpression.cs, Expression.cs: move EmitStored from
+	BinaryExpression to Expression.
+	* MethodCallExpression.cs: allow method calls on structs.
+
 2008-03-05  Jb Evain  <[email protected]>
 
 	* Expression.cs: Fix the Call method which takes an array

+ 10 - 0
mcs/class/System.Core/System.Linq.Expressions/Expression.cs

@@ -33,6 +33,7 @@ using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Linq;
 using System.Reflection;
+using System.Reflection.Emit;
 
 namespace System.Linq.Expressions {
 
@@ -1892,5 +1893,14 @@ namespace System.Linq.Expressions {
 		// compile the expression
 		//
 		internal abstract void Emit (EmitContext ec);
+
+		internal static LocalBuilder EmitStored (EmitContext ec, Expression expr)
+		{
+			var local = ec.ig.DeclareLocal (expr.Type);
+			expr.Emit (ec);
+			ec.ig.Emit (OpCodes.Stloc, local);
+
+			return local;
+		}
 	}
 }

+ 7 - 2
mcs/class/System.Core/System.Linq.Expressions/MethodCallExpression.cs

@@ -73,8 +73,13 @@ namespace System.Linq.Expressions {
 			foreach (var arg in arguments)
 				arg.Emit (ec);
 
-			if (obj != null)
-				obj.Emit (ec);
+			if (obj != null) {
+				if (obj.Type.IsValueType) {
+					var local = EmitStored (ec, obj);
+					ig.Emit (OpCodes.Ldloca, local);
+				} else
+					obj.Emit (ec);
+			}
 
 			ig.Emit (method.IsVirtual ? OpCodes.Callvirt : OpCodes.Call, method);
 		}