public static void ApplyOptimizations(List <MethodInterpreter> methodsToOptimize) { methodsToOptimize = methodsToOptimize.Where(m => m.Kind == MethodKind.Default).ToList(); bool doOptimize; do { doOptimize = false; var toRemove = methodsToOptimize.Where(mth => mth == null).ToArray(); foreach (var item in toRemove) { methodsToOptimize.Remove(item); } var inFunctionOptimizations = CommandLineParse.SortedOptimizations[OptimizationKind.InFunction]; var methodsArray = methodsToOptimize.ToArray(); //Parallel.ForEach(methodsToOptimize, methodBase=> foreach (var methodBase in methodsArray) { var interpreter = methodBase; //Console.WriteLine("Optimize locally: {0}", methodBase); MethodInterpreterCodeWriter.ApplyLocalOptimizations( inFunctionOptimizations, interpreter); } //); foreach (var methodBase in methodsArray) { var interpreter = methodBase; //Console.WriteLine("Optimize globally: {0}", methodBase); doOptimize |= MethodInterpreterCodeWriter.ApplyLocalOptimizations( CommandLineParse.SortedOptimizations[OptimizationKind.Global], interpreter); } } while (doOptimize); }
public void OptimizeClosure() { var level = new OptimizationLevels(); var optimizations = level.BuildOptimizationPasses1(); level.BuildOptimizationPasses2(); OptimizationLevelBase.UpdateOptimizationsFromCategories(optimizations); var cilMethods = MethodImplementations.Values .Where(m => m.Kind == MethodKind.CilInstructions) .Cast <CilMethodInterpreter>() .ToArray(); ResultingOptimizationPass.Closure = this; var doOptimize = true; while (doOptimize) { doOptimize = false; foreach (var cilMethod in cilMethods) { doOptimize |= MethodInterpreterCodeWriter.ApplyLocalOptimizations(optimizations, cilMethod); } var isOptimized = ApplyProgramWideOptimizations(); doOptimize |= isOptimized; } }
private static void WriteClosureBodies(List <MethodInterpreter> closure, StringBuilder sb, TypeDescriptionTable typeTable, CrRuntimeLibrary crRuntime) { sb.AppendLine("///--- PInvoke code --- "); foreach (var interpreter in closure) { if (interpreter.Kind != MethodKind.PlatformInvoke) { continue; } sb.AppendLine(MethodInterpreterCodeWriter.WritePInvokeMethodCode(interpreter)); } sb.AppendLine("///---Begin closure code --- "); foreach (var interpreter in closure) { if (interpreter.Kind != MethodKind.Default) { continue; } if (interpreter.Method.IsAbstract) { continue; } sb.AppendLine(MethodInterpreterCodeWriter.WriteMethodCode(interpreter, typeTable, crRuntime)); } sb.AppendLine("///---End closure code --- "); }
private static void WriteClosureBodies(List <MethodInterpreter> closure, StringBuilder sb, TypeDescriptionTable typeTable, ClosureEntities closureEntities) { sb.AppendLine("///--- PInvoke code --- "); foreach (var interpreter in closure) { if (interpreter.Kind != MethodKind.PlatformInvoke) { continue; } sb.AppendLine(MethodInterpreterCodeWriter.WritePInvokeMethodCode((PlatformInvokeMethod)interpreter, closureEntities)); } sb.AppendLine("///---Begin closure code --- "); foreach (var interpreter in closure) { if (interpreter.Kind != MethodKind.CilInstructions) { continue; } if (interpreter.Method.IsAbstract) { continue; } sb.AppendLine(MethodInterpreterCodeWriter.WriteMethodCode((CilMethodInterpreter)interpreter, typeTable, closureEntities)); } sb.AppendLine("///---End closure code --- "); }
static void WriteClosureHeaders(IEnumerable <MethodInterpreter> closure, CodeOutput codeOutput, ClosureEntities closureEntities) { closure.Where(interpreter => !interpreter.Method.IsAbstract) .Each(interpreter => { MethodInterpreterCodeWriter.WriteMethodSignature(codeOutput, interpreter, closureEntities); codeOutput.Append("\n"); }); }
private static void WriteClosureHeaders(IEnumerable <MethodInterpreter> closure, StringBuilder sb, ClosureEntities closureEntities) { var methodInterpreters = closure .Where(interpreter => !interpreter.Method.IsAbstract) .ToArray(); foreach (var interpreter in methodInterpreters) { sb.AppendLine(MethodInterpreterCodeWriter.WriteMethodSignature(interpreter, closureEntities)); } }
private static void WriteClosureDelegateBodies(List <MethodInterpreter> closure, StringBuilder sb) { foreach (var interpreter in closure) { if (interpreter.Kind != MethodKind.Delegate) { continue; } sb.AppendLine(MethodInterpreterCodeWriter.WriteDelegateCallCode(interpreter)); } sb.AppendLine(DelegateManager.Instance.BuildDelegateContent()); }
static void WriteClosureDelegateBodies(List <MethodInterpreter> closure, CodeOutput codeOutput) { foreach (var interpreter in closure) { if (interpreter.Kind != MethodKind.Delegate) { continue; } codeOutput.Append(MethodInterpreterCodeWriter.WriteDelegateCallCode(interpreter)); } codeOutput.Append(DelegateManager.Instance.BuildDelegateContent()); }
private static void WriteClosureHeaders(List <MethodInterpreter> closure, StringBuilder sb, CrRuntimeLibrary crRuntime) { foreach (var interpreter in closure) { if (interpreter.Kind != MethodKind.Default) { continue; } if (interpreter.Method.IsAbstract) { continue; } sb.AppendLine(MethodInterpreterCodeWriter.WriteMethodSignature(interpreter, crRuntime)); } }