Beispiel #1
0
        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 --- ");
        }
Beispiel #4
0
        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");
     });
 }
Beispiel #6
0
        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));
     }
 }