lifted relational tests
[mono.git] / mcs / class / System.Core / System.Linq.Expressions / MemberAssignment.cs
index cf04a52944c25eaebc4cb5f9f73d1639fc00b659..50c0c874ef24ba2f47eaa05691d55c2eedfe3fc8 100644 (file)
@@ -28,6 +28,7 @@
 
 using System;
 using System.Reflection;
+using System.Reflection.Emit;
 using System.Text;
 
 namespace System.Linq.Expressions {
@@ -39,5 +40,36 @@ namespace System.Linq.Expressions {
                public Expression Expression {
                        get { return expression; }
                }
+
+               internal MemberAssignment (MemberInfo member, Expression expression)
+                       : base (MemberBindingType.Assignment, member)
+               {
+                       this.expression = expression;
+               }
+
+               internal override void Emit (EmitContext ec, LocalBuilder local)
+               {
+                       this.Member.OnFieldOrProperty (
+                               field => EmitFieldAssignment (ec, field, local),
+                               prop => EmitPropertyAssignment (ec, prop, local));
+               }
+
+               void EmitFieldAssignment (EmitContext ec, FieldInfo field, LocalBuilder local)
+               {
+                       ec.EmitLoad (local);
+                       expression.Emit (ec);
+                       ec.ig.Emit (OpCodes.Stfld, field);
+               }
+
+               void EmitPropertyAssignment (EmitContext ec, PropertyInfo property, LocalBuilder local)
+               {
+                       var setter = property.GetSetMethod (true);
+                       if (setter == null)
+                               throw new InvalidOperationException ();
+
+                       ec.EmitLoad (local);
+                       expression.Emit (ec);
+                       ec.EmitCall (setter);
+               }
        }
 }