private static void CompileToMethodInternal(LambdaExpression lambda, MethodBuilder method, DebugInfoGenerator debugInfoGenerator, CompilerOptions options) { var compiledLambdas = new List <CompiledLambda>(); ParsedLambda parsedLambda; var module = method.Module as ModuleBuilder; if (module == null) { throw new ArgumentException("Unable to obtain module builder of the method", "method"); } method.SetReturnType(lambda.ReturnType); method.SetParameters(lambda.Parameters.Select(parameter => parameter.Type).ToArray()); var resolvedLambda = new ExpressionClosureResolver(lambda, module, false, options).Resolve(out parsedLambda); if (!string.IsNullOrEmpty(DebugOutputDirectory)) { resolvedLambda = AdvancedDebugViewWriter.WriteToModifying(resolvedLambda, parsedLambda.ConstantsType, parsedLambda.ConstantsParameter, parsedLambda.Constants, GenerateFileName(resolvedLambda)); } if (parsedLambda.ConstantsParameter != null) { throw new InvalidOperationException("Non-trivial constants are not allowed for compilation to method"); } CompileToMethodInternal(resolvedLambda, debugInfoGenerator, parsedLambda, options, compiledLambdas, method); }
private static Delegate CompileInternal(LambdaExpression lambda, DebugInfoGenerator debugInfoGenerator, out CompiledLambda[] subLambdas, CompilerOptions options) { var compiledLambdas = new List <CompiledLambda>(); ParsedLambda parsedLambda; var emitToDynamicMethod = debugInfoGenerator == null; var resolvedLambda = new ExpressionClosureResolver(lambda, Module, emitToDynamicMethod, options).Resolve(out parsedLambda); if (!string.IsNullOrEmpty(DebugOutputDirectory)) { resolvedLambda = AdvancedDebugViewWriter.WriteToModifying(resolvedLambda, parsedLambda.ConstantsType, parsedLambda.ConstantsParameter, parsedLambda.Constants, GenerateFileName(resolvedLambda)); } var compiledLambda = CompileInternal(resolvedLambda, debugInfoGenerator, parsedLambda, options, false, compiledLambdas); subLambdas = compiledLambdas.ToArray(); if (compiledLambdas.Count > 0 && emitToDynamicMethod) { BuildDelegatesFoister(parsedLambda)(parsedLambda.Constants, compiledLambdas.Select(compIledLambda => compIledLambda.Delegate).ToArray()); } return(compiledLambda.Delegate); }