Example #1
0
        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);
        }
Example #2
0
        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);
        }