Example #1
0
        public string Decompile()
        {
            if (Script == null)
            {
                return("");
            }

            Script.Resolve();

            Dictionary <Method, BlockStatement> methods = new Dictionary <Method, BlockStatement>();

            methods.Add(Script.Methods[Script.TopLevel], DecompileObject(Script.TopLevel));
            foreach (var method in Script.Methods)
            {
                if (method.Key == Script.TopLevel)
                {
                    continue;
                }

                switch (method.Key.ContextType)
                {
                case TjsContextType.PropertyGetter:
                case TjsContextType.PropertySetter:
                    break;

                case TjsContextType.Function:
                case TjsContextType.ExprFunction:
                case TjsContextType.TopLevel:
                    var block = DecompileObject(method.Key);
                    methods.Add(method.Value, block);
                    break;
                }
            }

            var writer = new StringWriter();
            var tjs    = new TjsWriter(writer)
            {
                MethodRefs = methods
            };

            tjs.WriteLicense();

            foreach (var m in methods)
            {
                if (m.Key.IsLambda)
                {
                    continue;
                }

                tjs.WriteLine();
                tjs.WriteFunction(m.Key, m.Value);
                tjs.WriteLine();
            }

            writer.Flush();
            var result = writer.ToString();

            return(result);
        }
Example #2
0
        public void TestDecompileBlock()
        {
            var    path = "..\\..\\Res\\Initialize.tjs.comp";
            Module md   = new Module(path);
            var    mt   = md.TopLevel.ResolveMethod();

            mt.Compact();

            DecompileContext context = new DecompileContext(md.TopLevel);

            context.ScanBlocks(mt.Instructions);
            context.ComputeDominators();
            context.ComputeNaturalLoops();

            context.FillInBlocks(mt.Instructions);

            var pass1 = new RegMemberPass();
            var entry = pass1.Process(context, new BlockStatement());
            var pass2 = new ExpressionPass();

            entry = pass2.Process(context, entry);

            var b  = context.Blocks[1];
            var s1 = b.Statements.FirstOrDefault();

            var pass3 = new ControlFlowPass();

            entry = pass3.Process(context, entry);
            var c = entry.Statements.Count;

            foreach (var st in entry.Statements)
            {
                var s = st;
            }

            var pass4 = new StatementCollectPass();

            entry = pass4.Process(context, entry);

            foreach (var statement in entry.Statements)
            {
                var s = statement;
            }

            var       sWriter = new StringWriter();
            TjsWriter writer  = new TjsWriter(sWriter);

            writer.WriteBlock(entry);
            sWriter.Flush();
            var result = sWriter.ToString();
        }
Example #3
0
        internal string Decompile(string objName)
        {
            if (Script == null)
            {
                return("");
            }

            Script.Resolve();

            Dictionary <Method, BlockStatement> methods = new Dictionary <Method, BlockStatement>();

            //methods.Add(Script.Methods[Script.TopLevel], DecompileObject(Script.TopLevel));

            var method = Script.Methods.FirstOrDefault(m => m.Key.Name == objName);
            var block  = DecompileObject(method.Key);

            methods.Add(method.Value, block);

            var writer = new StringWriter();
            var tjs    = new TjsWriter(writer)
            {
                MethodRefs = methods
            };

            tjs.WriteLicense();

            foreach (var m in methods)
            {
                if (m.Key.IsLambda)
                {
                    continue;
                }

                tjs.WriteLine();
                tjs.WriteFunction(m.Key, m.Value);
                tjs.WriteLine();
            }

            writer.Flush();
            var result = writer.ToString();

            return(result);
        }