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); }
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(); }
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); }