private void EmitInvocationExpression(Expression expr, CompilationFlags flags) { InvocationExpression node = (InvocationExpression)expr; // Optimization: inline code for literal lambda's directly // // This is worth it because otherwise we end up with an extra call // to DynamicMethod.CreateDelegate, which is expensive. // if (node.LambdaOperand != null) { EmitInlinedInvoke(node, flags); return; } expr = node.Expression; 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, LambdaExpression.GetCompileMethod(expr.Type)); } EmitMethodCall(expr, expr.Type.GetInvokeMethod(), node, CompilationFlags.EmitAsNoTail | CompilationFlags.EmitExpressionStart); }