revert
[mono.git] / mcs / class / System.Core / System.Linq.Expressions / MemberBinding.cs
index 84be941f6fa2321269497c86d3d781df01d6cb7f..9eae49ac24c0878fd30d865b9dc9fe8141c002c7 100644 (file)
@@ -28,6 +28,7 @@
 
 using System;
 using System.Reflection;
+using System.Reflection.Emit;
 
 namespace System.Linq.Expressions {
 
@@ -54,5 +55,41 @@ namespace System.Linq.Expressions {
                {
                        return ExpressionPrinter.ToString (this);
                }
+
+               internal abstract void Emit (EmitContext ec, LocalBuilder local);
+
+               internal LocalBuilder EmitLoadMember (EmitContext ec, LocalBuilder local)
+               {
+                       ec.EmitLoad (local);
+
+                       switch (member.MemberType) {
+                       case MemberTypes.Property:
+                               return EmitLoadProperty (ec, (PropertyInfo) member);
+                       case MemberTypes.Field:
+                               return EmitLoadField (ec, (FieldInfo) member);
+                       default:
+                               throw new NotSupportedException (member.MemberType.ToString ());
+                       }
+               }
+
+               LocalBuilder EmitLoadProperty (EmitContext ec, PropertyInfo property)
+               {
+                       var getter = property.GetGetMethod (true);
+                       if (getter == null)
+                               throw new NotSupportedException ();
+
+                       var store = ec.ig.DeclareLocal (property.PropertyType);
+                       ec.EmitCall (getter);
+                       ec.ig.Emit (OpCodes.Stloc, store);
+                       return store;
+               }
+
+               LocalBuilder EmitLoadField (EmitContext ec, FieldInfo field)
+               {
+                       var store = ec.ig.DeclareLocal (field.FieldType);
+                       ec.ig.Emit (OpCodes.Ldfld, field);
+                       ec.ig.Emit (OpCodes.Stloc, store);
+                       return store;
+               }
        }
 }