// * // * Prints out a sequences of statements on separate lines. Correctly // * informs the last statement that it is last in a block. // public static void printSequence(Output @out, List<Statement> stmts) { int n = stmts.Count; for(int i = 0; i < n; i++) { bool last = (i + 1 == n); Statement stmt = stmts[i]; Statement next = last ? null : stmts[i + 1]; if(last) { stmt.printTail(@out); } else { stmt.print(@out); } if(next != null && stmt is FunctionCallStatement && next.beginsWithParen()) { @out.print(";"); } if(!(stmt is IfThenElseBlock)) { @out.println(); } } }
private void printMain(Output @out, Decompiler d, bool includeFirst) { @out.print("("); int Start = includeFirst ? 0 : 1; if (function.numParams > Start) { new VariableTarget(d.declList[Start]).print(@out); for (int i = Start + 1; i < function.numParams; i++) { @out.print(", "); new VariableTarget(d.declList[i]).print(@out); } } if ((function.vararg & 1) == 1) { if (function.numParams > Start) { @out.print(", ..."); } else { @out.print("..."); } } @out.print(")"); @out.println(); @out.indent(); d.decompile(); d.print(@out); @out.dedent(); @out.print("end"); //out.println(); //This is an extra space for formatting }
public override void print(Output @out) { Decompiler d = new Decompiler(function); @out.print("function"); printMain(@out, d, true); }
public override void print(Output @out) { @out.print("for "); r.getTarget(register + 3, begin - 1).print(@out); for(int r1 = register + 4; r1 <= register + 2 + length; r1++) { @out.print(", "); r.getTarget(r1, begin - 1).print(@out); } @out.print(" in "); Expression @value; @value = r.getValue(register, begin - 1); @value.print(@out); if([email protected]()) { @out.print(", "); @value = r.getValue(register + 1, begin - 1); @value.print(@out); if([email protected]()) { @out.print(", "); @value = r.getValue(register + 2, begin - 1); @value.print(@out); } } @out.print(" do"); @out.println(); @out.indent(); Statement.printSequence(@out, statements); @out.dedent(); @out.print("end"); }
public override void print(Output @out) { @out.print("if "); branch.asExpression(r).print(@out); @out.print(" then"); @out.println(); @out.indent(); //Handle the case where the "then" is empty in if-then-else. //The jump over the else block is falsely detected as a break. if(statements.Count == 1 && statements[0] is Break) { Break b = (Break) statements[0]; if(b.target == loopback) { @out.dedent(); return; } } Statement.printSequence(@out, statements); @out.dedent(); if(emptyElse) { @out.println("else"); @out.println("end"); } }
public override void print(Output @out) { @out.print(op); if(precedence > expression.precedence) @out.print("("); expression.print(@out); if(precedence > expression.precedence) @out.print(")"); }
public override void print(Output @out) { @out.print("repeat"); @out.println(); @out.indent(); Statement.printSequence(@out, statements); @out.dedent(); @out.print("until "); branch.asExpression(r).print(@out); }
public override void print(Output @out) { @out.print("while "); branch.asExpression(r).print(@out); @out.print(" do"); @out.println(); @out.indent(); Statement.printSequence(@out, statements); @out.dedent(); @out.print("end"); }
public override void print(Output @out) { @out.print(op); if (precedence > expression.precedence) { @out.print("("); } expression.print(@out); if (precedence > expression.precedence) { @out.print(")"); } }
public override void printClosure(Output @out, Target name) { Decompiler d = new Decompiler(function); @out.print("function "); if(function.numParams >= 1 && d.declList[0].name.Equals("self") && name is TableTarget) { name.printMethod(@out); printMain(@out, d, false); } else { name.print(@out); printMain(@out, d, true); } }
public override void printClosure(Output @out, Target name) { Decompiler d = new Decompiler(function); @out.print("function "); if (function.numParams >= 1 && d.declList[0].name.Equals("self") && name is TableTarget) { name.printMethod(@out); printMain(@out, d, false); } else { name.print(@out); printMain(@out, d, true); } }
public override void print(Output @out) { List<Expression> args = new List<Expression>(arguments.Length); if(isMethodCall()) { Expression obj = function.getTable(); if(obj.isClosure() || obj.isConstant()) { @out.print("("); obj.print(@out); @out.print(")"); } else { obj.print(@out); } @out.print(":"); @out.print(function.getField()); for(int i = 1; i < arguments.Length; i++) { args.Add(arguments[i]); } } else { if(function.isClosure() || function.isConstant()) { @out.print("("); function.print(@out); @out.print(")"); } else { function.print(@out); } for(int i = 0; i < arguments.Length; i++) { args.Add(arguments[i]); } } @out.print("("); Expression.printSequence(@out, args, false, true); @out.print(")"); }
public override void print(Output @out) { @out.print("for "); r.getTarget(register + 3, begin - 1).print(@out); @out.print(" = "); r.getValue(register, begin - 1).print(@out); @out.print(", "); r.getValue(register + 1, begin - 1).print(@out); Expression step = r.getValue(register + 2, begin - 1); if(!step.isInteger() || step.asInteger() != 1) { @out.print(", "); step.print(@out); } @out.print(" do"); @out.println(); @out.indent(); Statement.printSequence(@out, statements); @out.dedent(); @out.print("end"); }
public override void print(Output @out) { if(statements.Count == 1 && statements[0] is IfThenEndBlock) { @out.print("else"); statements[0].print(@out); } else if(statements.Count == 2 && statements[0] is IfThenElseBlock && statements[1] is ElseEndBlock) { @out.print("else"); statements[0].print(@out); statements[1].print(@out); } else { @out.print("else"); @out.println(); @out.indent(); Statement.printSequence(@out, statements); @out.dedent(); @out.print("end"); } }
public override void printMethod(Output @out) { throw new Exception(); }
public override void print(Output @out) { @out.print(decl.name); }
public override void printMethod(Output @out) { table.print(@out); @out.print(":"); @out.print(index.asName()); }
protected internal static void printUnary(Output @out, string op, Expression expression) { @out.print(op); expression.print(@out); }
public virtual void printClosure(Output @out, Target name) { throw new Exception(); }
public override void print(Output @out) { if(targets.Count != 0) { if(_declare) { @out.print("local "); } bool functionSugar = false; if(targets.Count == 1 && values.Count == 1 && values[0].isClosure() && targets[0].isFunctionName()) { Expression closure = values[0]; //comment = "" + declareStart + " >= " + closure.closureUpvalueLine(); //System.out.println("" + declareStart + " >= " + closure.closureUpvalueLine()); // This check only works in Lua version 0x51 if(!_declare || declareStart >= closure.closureUpvalueLine()) { functionSugar = true; } if(targets[0].isLocal() && closure.isUpvalueOf(targets[0].getIndex())) { functionSugar = true; } //if(closure.isUpvalueOf(targets.get(0).)) } if(!functionSugar) { targets[0].print(@out); for(int i = 1; i < targets.Count; i++) { @out.print(", "); targets[i].print(@out); } if(!_declare || !allnil) { @out.print(" = "); Expression.printSequence(@out, values, false, false); } } else { values[0].printClosure(@out, targets[0]); } if(comment != null) { @out.print(" -- "); @out.print(comment); } } }
public override void print(Output @out) { @out.print(name); }
public override void print(Output @out) { new TableReference(table, index).print(@out); }
public virtual void printTail(Output @out) { print(@out); }
public override void print(Output @out) { if(assign != null && assign.getFirstTarget() != null) { Assignment assignOut = new Assignment(assign.getFirstTarget(), Value); assignOut.print(@out); } else { @out.print("-- unhandled set block"); @out.println(); } }
private void printMain(Output @out, Decompiler d, bool includeFirst) { @out.print("("); int Start = includeFirst ? 0 : 1; if(function.numParams > Start) { new VariableTarget(d.declList[Start]).print(@out); for(int i = Start + 1; i < function.numParams; i++) { @out.print(", "); new VariableTarget(d.declList[i]).print(@out); } } if((function.vararg & 1) == 1) { if(function.numParams > Start) { @out.print(", ..."); } else { @out.print("..."); } } @out.print(")"); @out.println(); @out.indent(); d.decompile(); d.print(@out); @out.dedent(); @out.print("end"); //out.println(); //This is an extra space for formatting }
public override void print(Output @out) { constant.print(@out); }
protected internal static void printBinary(Output @out, string op, Expression left, Expression right) { left.print(@out); @out.print(" "); @out.print(op); @out.print(" "); right.print(@out); }
public override void print(Output @out) { call.print(@out); }
// * // * Prints the expression in a context that accepts multiple values. // * (Thus, if an expression that normally could return multiple values // * doesn't, it should use parens to adjust to 1.) // public virtual void printMultiple(Output @out) { print(@out); }
// * // * Prints out a sequences of expressions with commas, and optionally // * handling multiple expressions and return value adjustment. // public static void printSequence(Output @out, List<Expression> exprs, bool linebreak, bool multiple) { int n = exprs.Count; int i = 1; foreach(Expression expr in exprs) { bool last = (i == n); if(expr.isMultiple()) { last = true; } if(last) { if(multiple) { expr.printMultiple(@out); } else { expr.print(@out); } break; } else { expr.print(@out); @out.print(","); if(linebreak) { @out.println(); } else { @out.print(" "); } } i++; } }
public override void printMultiple(Output @out) { if(!multiple) { @out.print("("); } print(@out); if(!multiple) { @out.print(")"); } }
public override void printMultiple(Output @out) { @out.print(multiple ? "..." : "(...)"); }
public abstract void print(Output @out);
public override void print(Output @out) { //out.print("..."); @out.print(multiple ? "..." : "(...)"); }