Beispiel #1
0
 private static string GetLibrary(IPackageOrComponentDescriptor desc)
 {
     var lib = desc.Library;
     if (lib == null)
         lib = "work";
     return lib;
 }
Beispiel #2
0
        private void GenerateDependencies(IPackageOrComponentDescriptor desc, IndentedTextWriter tw)
        {
            foreach (var kvp in _pkgRefs.OrderBy(kvp => kvp.Key))
            {
                bool allNonSynth = kvp.Value.All(s => !_synthPkgRefs.Contains(Tuple.Create(kvp.Key, s)));
                if (allNonSynth)
                    SwitchOffSynthesis(tw);
                tw.WriteLine("library " + kvp.Key + ";");
                foreach (string pkg in kvp.Value.OrderBy(s => s))
                {
                    bool nonSynth = !allNonSynth && !_synthPkgRefs.Contains(Tuple.Create(kvp.Key, pkg));
                    if (nonSynth)
                        SwitchOffSynthesis(tw);
                    tw.WriteLine("use " + kvp.Key + "." + pkg + ".all;");
                    if (nonSynth)
                        SwitchOnSynthesis(tw);
                }
                if (allNonSynth)
                    SwitchOnSynthesis(tw);
            }

            var pds = desc.Dependencies
                .Where(pd => pd != desc && !pd.IsEmpty)
                .GroupBy(pd => GetLibrary(pd));

            foreach (var grp in pds)
            {
                tw.WriteLine("library {0};", grp.Key);

                foreach (var pd in grp)
                {
                    tw.WriteLine("use {0}.{1}.all;", grp.Key, MakeIDName(pd.PackageName, pd));
                }
            }

            tw.WriteLine("library {0};", GetLibrary(desc));

            tw.WriteLine();
        }
        private void DecompileAndEnqueueCallees(CodeDescriptor cd, object instance, object[] arguments, MethodCallInfo mymci = null)
        {
            IPackageOrComponentDescriptor owner = cd.Owner as IPackageOrComponentDescriptor;

            var rmd = cd.Method.GetCustomOrInjectedAttribute <RewriteMethodDefinition>();

            IDecompilationResult result;

            var md = cd as MethodDescriptor;
            var pd = cd as ProcessDescriptor;

            if (pd != null)
            {
                _context.CurrentProcess = pd.Instance;
            }
            else
            {
                _context.CurrentProcess = md.CallingProcess.Instance;
            }

            EVariability[] argVar;
            if (md == null)
            {
                argVar = new EVariability[0];
            }
            else
            {
                argVar = md.ArgVariabilities;
            }
            if (rmd != null)
            {
                result = rmd.Rewrite(_context, cd, instance, arguments);
            }
            else if (cd.Method.IsMoveNext())
            {
                var decomp = new AsyncMethodDecompiler(_context, cd, instance, arguments);
                result                   = decomp.Decompile();
                cd.Implementation        = result.Decompiled;
                cd.GenuineImplementation = result.Decompiled;
            }
            else
            {
                var decomp = new MSILDecompiler(cd, instance, arguments, argVar);
                if (cd is ProcessDescriptor)
                {
                    decomp.Template.DisallowReturnStatements = true;
                }
                decomp.Template.DisallowConditionals = true;
                if (mymci != null)
                {
                    mymci.Inherit(decomp.Template);
                }
                result                   = decomp.Decompile();
                cd.Implementation        = result.Decompiled;
                cd.GenuineImplementation = result.Decompiled;
            }

            foreach (var mci in result.CalledMethods)
            {
                _methodQ.Enqueue(mci);
            }
            foreach (var fri in result.ReferencedFields)
            {
                AnalyzeFieldRef(fri, cd);
            }

            _allMethods.Add(cd);
        }