Merge pull request #656 from LogosBible/collection_lock
[mono.git] / mcs / class / System.Core / System.Linq.Expressions / LambdaExpression.cs
index b9343b159cffc69462fa0dbcc8cceaf213d50d4d..6e873b0c9b2d8b12c37a7362b4e0aaa9ff7e6620 100644 (file)
@@ -31,7 +31,10 @@ using System;
 using System.Collections.ObjectModel;
 using System.Collections.Generic;
 using System.Reflection;
+#if !FULL_AOT_RUNTIME
 using System.Reflection.Emit;
+#endif
+
 
 namespace System.Linq.Expressions {
 
@@ -48,41 +51,14 @@ namespace System.Linq.Expressions {
                        get { return parameters; }
                }
 
-               static bool CanAssign (Type target, Type source)
-               {
-                       // This catches object and value type mixage, type compatibility is handled later
-                       if (target.IsValueType ^ source.IsValueType)
-                               return false;
-
-                       return source.IsAssignableTo (target);
-               }
-
                internal LambdaExpression (Type delegateType, Expression body, ReadOnlyCollection<ParameterExpression> parameters)
                        : base (ExpressionType.Lambda, delegateType)
                {
-                       if (!delegateType.IsSubclassOf (typeof (System.Delegate)))
-                               throw new ArgumentException ("delegateType");
-
-                       var invoke = delegateType.GetMethod ("Invoke", BindingFlags.Instance | BindingFlags.Public);
-                       if (invoke == null)
-                               throw new ArgumentException ("delegate must contain an Invoke method", "delegateType");
-
-                       var invoke_parameters = invoke.GetParameters ();
-                       if (invoke_parameters.Length != parameters.Count)
-                               throw new ArgumentException (string.Format ("Different number of arguments in delegate {0}", delegateType), "delegateType");
-
-                       for (int i = 0; i < invoke_parameters.Length; i++){
-                               if (!CanAssign (parameters [i].Type, invoke_parameters [i].ParameterType))
-                                       throw new ArgumentException (String.Format ("Can not assign a {0} to a {1}", invoke_parameters [i].ParameterType, parameters [i].Type));
-                       }
-
-                       if (invoke.ReturnType != typeof (void) && !CanAssign (invoke.ReturnType, body.Type))
-                               throw new ArgumentException (String.Format ("body type {0} can not be assigned to {1}", body.Type, invoke.ReturnType));
-
                        this.body = body;
                        this.parameters = parameters;
                }
 
+#if !FULL_AOT_RUNTIME
                void EmitPopIfNeeded (EmitContext ec)
                {
                        if (GetReturnType () == typeof (void) && body.Type != typeof (void))
@@ -90,21 +66,39 @@ namespace System.Linq.Expressions {
                }
 
                internal override void Emit (EmitContext ec)
+               {
+                       ec.EmitCreateDelegate (this);
+               }
+
+               internal void EmitBody (EmitContext ec)
                {
                        body.Emit (ec);
                        EmitPopIfNeeded (ec);
                        ec.ig.Emit (OpCodes.Ret);
                }
+#endif
 
                internal Type GetReturnType ()
                {
-                       return this.Type.GetMethod ("Invoke").ReturnType;
+                       return this.Type.GetInvokeMethod ().ReturnType;
                }
 
                public Delegate Compile ()
                {
-                       var context = EmitContext.Create (this);
+#if FULL_AOT_RUNTIME
+                       return new System.Linq.jvm.Runner (this).CreateDelegate ();
+#else
+                       var context = new CompilationContext ();
+                       context.AddCompilationUnit (this);
                        return context.CreateDelegate ();
+#endif
+               }
+
+#if FULL_AOT_RUNTIME
+               internal Delegate Compile (System.Linq.jvm.ExpressionInterpreter interpreter)
+               {
+                       return new System.Linq.jvm.Runner (this, interpreter).CreateDelegate ();
                }
+#endif
        }
 }