コード例 #1
0
ファイル: AssemblyTranslator.cs プロジェクト: nowonu/JSIL
        public AssemblyDefinition[] Translate(string assemblyPath, Stream outputStream = null, bool scanForProxies = true)
        {
            var assemblies = LoadAssembly(assemblyPath);

            if (scanForProxies)
                TypeInfoProvider.AddProxyAssemblies(assemblies);

            GeneratedFiles.Add(assemblyPath);

            var context = new DecompilerContext(assemblies.First().MainModule);

            context.Settings.YieldReturn = false;
            context.Settings.AnonymousMethods = true;
            context.Settings.QueryExpressions = false;
            context.Settings.LockStatement = false;
            context.Settings.FullyQualifyAmbiguousTypeNames = true;
            context.Settings.ForEachStatement = false;

            var pr = new ProgressReporter();
            if (Decompiling != null)
                Decompiling(pr);

            for (int i = 0; i < assemblies.Length; i++) {
                pr.OnProgressChanged(i, assemblies.Length);
                Analyze(context, assemblies[i]);
            }

            pr.OnFinished();

            OptimizeAll();

            Action<AssemblyDefinition> handler;

            if (outputStream == null) {
                handler = (assembly) => {
                    var outputPath = Path.Combine(OutputDirectory, assembly.Name + ".js");

                    if (File.Exists(outputPath))
                        File.Delete(outputPath);

                    using (outputStream = File.OpenWrite(outputPath))
                        Translate(context, assembly, outputStream);
                };

                if (!Directory.Exists(OutputDirectory))
                    Directory.CreateDirectory(OutputDirectory);
            } else {
                handler = (assembly) =>
                    Translate(context, assembly, outputStream);
            }

            pr = new ProgressReporter();
            if (Writing != null)
                Writing(pr);

            for (int i = 0; i < assemblies.Length; i++) {
                pr.OnProgressChanged(i, assemblies.Length);
                handler(assemblies[i]);
            }

            pr.OnFinished();

            return assemblies;
        }
コード例 #2
0
ファイル: AssemblyTranslator.cs プロジェクト: nowonu/JSIL
        protected void OptimizeAll()
        {
            var pr = new ProgressReporter();
            if (Optimizing != null)
                Optimizing(pr);

            int i = 0;
            while (FunctionCache.OptimizationQueue.Count > 0) {
                var id = FunctionCache.OptimizationQueue.First();
                FunctionCache.OptimizationQueue.Remove(id);

                var e = FunctionCache.Cache[id];
                if (e.Expression == null) {
                    i++;
                    continue;
                }

                pr.OnProgressChanged(i++, i + FunctionCache.OptimizationQueue.Count);
                OptimizeFunction(e.SpecialIdentifiers, e.ParameterNames, e.Variables, e.Expression);
            }

            pr.OnFinished();
        }
コード例 #3
0
ファイル: AssemblyTranslator.cs プロジェクト: robashton/JSIL
        protected void OptimizeAll()
        {
            var pr = new ProgressReporter();
            if (Optimizing != null)
                Optimizing(pr);

            int i = 0, c = FunctionCache.Cache.Count;
            foreach (var e in FunctionCache.Cache.Values) {
                if (e.Expression == null) {
                    i++;
                    continue;
                }

                pr.OnProgressChanged(i++, c);
                OptimizeFunction(e.SpecialIdentifiers, e.ParameterNames, e.Variables, e.Expression);
            }

            pr.OnFinished();
        }