Ejemplo n.º 1
0
 //  *
 //   * 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();
       }
     }
 }
Ejemplo n.º 2
0
        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
        }
Ejemplo n.º 3
0
        public override void print(Output @out)
        {
            Decompiler d = new Decompiler(function);

            @out.print("function");
            printMain(@out, d, true);
        }
Ejemplo n.º 4
0
 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");
 }
Ejemplo n.º 5
0
 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");
     }
 }
Ejemplo n.º 6
0
	  public override void print(Output @out)
	  {
		@out.print(op);
		if(precedence > expression.precedence)
			@out.print("(");
		expression.print(@out);
		if(precedence > expression.precedence)
			@out.print(")");
	  }
Ejemplo n.º 7
0
 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);
 }
Ejemplo n.º 8
0
 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");
 }
Ejemplo n.º 9
0
 public override void print(Output @out)
 {
     @out.print(op);
     if (precedence > expression.precedence)
     {
         @out.print("(");
     }
     expression.print(@out);
     if (precedence > expression.precedence)
     {
         @out.print(")");
     }
 }
Ejemplo n.º 10
0
 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);
     }
 }
Ejemplo n.º 11
0
        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);
            }
        }
Ejemplo n.º 12
0
 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(")");
 }
Ejemplo n.º 13
0
 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");
 }
Ejemplo n.º 14
0
 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");
     }
 }
Ejemplo n.º 15
0
 public override void printMethod(Output @out)
 {
     throw new Exception();
 }
Ejemplo n.º 16
0
 public override void print(Output @out)
 {
     @out.print(decl.name);
 }
Ejemplo n.º 17
0
 public override void printMethod(Output @out)
 {
     table.print(@out);
     @out.print(":");
     @out.print(index.asName());
 }
Ejemplo n.º 18
0
 protected internal static void printUnary(Output @out, string op, Expression expression)
 {
     @out.print(op);
     expression.print(@out);
 }
Ejemplo n.º 19
0
 public virtual void printClosure(Output @out, Target name)
 {
     throw new Exception();
 }
Ejemplo n.º 20
0
	  public override void printMethod(Output @out)
	  {
		table.print(@out);
		@out.print(":");
		@out.print(index.asName());
	  }
Ejemplo n.º 21
0
 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);
       }
     }
 }
Ejemplo n.º 22
0
 public override void print(Output @out)
 {
     @out.print(name);
 }
Ejemplo n.º 23
0
	  public override void print(Output @out)
	  {
		new TableReference(table, index).print(@out);
	  }
Ejemplo n.º 24
0
 public virtual void printTail(Output @out)
 {
     print(@out);
 }
Ejemplo n.º 25
0
 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();
     }
 }
Ejemplo n.º 26
0
 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
 }
Ejemplo n.º 27
0
 public override void print(Output @out)
 {
     constant.print(@out);
 }
Ejemplo n.º 28
0
 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);
 }
Ejemplo n.º 29
0
 public override void print(Output @out)
 {
     call.print(@out);
 }
Ejemplo n.º 30
0
 //  *
 //   * 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);
 }
Ejemplo n.º 31
0
	  public override void print(Output @out)
	  {
		call.print(@out);
	  }
Ejemplo n.º 32
0
	  public override void print(Output @out)
	  {
		constant.print(@out);
	  }
Ejemplo n.º 33
0
 public override void print(Output @out)
 {
     Decompiler d = new Decompiler(function);
     @out.print("function");
     printMain(@out, d, true);
 }
Ejemplo n.º 34
0
 //  *
 //   * 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++;
     }
 }
Ejemplo n.º 35
0
 public override void printMultiple(Output @out)
 {
     if(!multiple)
     {
       @out.print("(");
     }
     print(@out);
     if(!multiple)
     {
       @out.print(")");
     }
 }
Ejemplo n.º 36
0
 public override void printMultiple(Output @out)
 {
     @out.print(multiple ? "..." : "(...)");
 }
Ejemplo n.º 37
0
 public override void print(Output @out)
 {
     new TableReference(table, index).print(@out);
 }
Ejemplo n.º 38
0
 public abstract void print(Output @out);
Ejemplo n.º 39
0
 public override void print(Output @out)
 {
     //out.print("...");
     @out.print(multiple ? "..." : "(...)");
 }