Compile InvocationExpression target if necessary (dotnet/corefx#39101)
authorCharles Stoner <chucks@microsoft.com>
Tue, 2 Jul 2019 17:28:28 +0000 (10:28 -0700)
committerGitHub <noreply@github.com>
Tue, 2 Jul 2019 17:28:28 +0000 (10:28 -0700)
Commit migrated from https://github.com/dotnet/corefx/commit/52a6a31678753e25ce9b6949d45ea85b215aed81

src/libraries/System.Linq.Expressions/src/System/Linq/Expressions/Compiler/LambdaCompiler.Expressions.cs
src/libraries/System.Linq.Expressions/tests/Lambda/LambdaTests.cs

index 042140e..2024514 100644 (file)
@@ -181,7 +181,12 @@ namespace System.Linq.Expressions.Compiler
             }
 
             expr = node.Expression;
-            Debug.Assert(!typeof(LambdaExpression).IsAssignableFrom(expr.Type));
+            if (typeof(LambdaExpression).IsAssignableFrom(expr.Type))
+            {
+                // if the invoke target is a lambda expression tree, first compile it into a delegate
+                expr = Expression.Call(expr, expr.Type.GetMethod("Compile", Array.Empty<Type>()));
+            }
+
             EmitMethodCall(expr, expr.Type.GetInvokeMethod(), node, CompilationFlags.EmitAsNoTail | CompilationFlags.EmitExpressionStart);
         }
 
index 915ce34..09719f7 100644 (file)
@@ -56,7 +56,6 @@ namespace System.Linq.Expressions.Tests
         }
 
         [Theory, ClassData(typeof(CompilationTypes))]
-        [ActiveIssue(30471)]
         public void InvokeComputedLambda(bool useInterpreter)
         {
             ParameterExpression x = Expression.Parameter(typeof(int), "x");