public ForBlock(LFunction function, int begin, int end, int register, Registers r) : base(function, begin, end) { this.register = register; this.r = r; statements = new List<Statement>(end - begin + 1); }
public override Expression asExpression(Registers r) { bool transpose = false; string op = _invert ? "~=" : "=="; return(new BinaryExpression(op, r.getKExpression(!transpose ? left : right, line), r.getKExpression(!transpose ? right : left, line), Expression.PRECEDENCE_COMPARE, Expression.ASSOCIATIVITY_LEFT)); }
public RepeatBlock(LFunction function, Branch branch, Registers r) : base(function, branch.end, branch.begin) { //System.out.println("-- creating repeat block " + branch.end + " .. " + branch.begin); this.branch = branch; this.r = r; statements = new List<Statement>(branch.begin - branch.end + 1); }
public IfThenEndBlock(LFunction function, Branch branch, unluac.util.Stack<Branch> stack, Registers r) : base(function, branch.begin == branch.end ? branch.begin - 1 : branch.begin, branch.begin == branch.end ? branch.begin - 1 : branch.end) { this.branch = branch; this.stack = stack; this.r = r; statements = new List<Statement>(branch.end - branch.begin + 1); }
public WhileBlock(LFunction function, Branch branch, int loopback, Registers r) : base(function, branch.begin, branch.end) { this.branch = branch; this.loopback = loopback; this.r = r; statements = new List<Statement>(branch.end - branch.begin + 1); }
public IfThenElseBlock(LFunction function, Branch branch, int loopback, bool emptyElse, Registers r) : base(function, branch.begin, branch.end) { this.branch = branch; this.loopback = loopback; this.emptyElse = emptyElse; this.r = r; statements = new List<Statement>(branch.end - branch.begin + 1); }
public override Expression asExpression(Registers r) { if(_invert) { return (new NotBranch(this.invert())).asExpression(r); } else { return r.getExpression(test, line); } }
public SetBlock(LFunction function, Branch branch, int target, int line, int begin, int end, bool empty, Registers r) : base(function, begin, end) { this.empty = empty; if(begin == end) this.begin -= 1; this.target = target; this.branch = branch; this.r = r; //System.out.println("-- set block " + begin + " .. " + end); }
public override Expression asExpression(Registers r) { if (_invert) { return((new NotBranch(this.invert())).asExpression(r)); } else { return(r.getExpression(test, line)); } }
public override Statement process(Registers r, Block block) { if (table.isTableLiteral()) { table.addEntry(new TableLiteral.Entry(index, @value, !isTable, timestamp)); return(null); } else { return(new Assignment(new TableTarget(table, index), @value)); } }
public override Statement process(Registers r, Block block) { if(table.isTableLiteral()) { table.addEntry(new TableLiteral.Entry(index, @value, !isTable, timestamp)); return null; } else { return new Assignment(new TableTarget(table, index), @value); } }
public override Statement process(Registers r, Block block) { //System.out.println("-- processing register set " + register + "@" + line); r.setValue(register, line, @value); // // if(value.isMultiple()) { // System.out.println("-- process multiple @" + register); // } // if (r.isAssignable(register, line)) { //System.out.println("-- assignment!"); return(new Assignment(r.getTarget(register, line), @value)); } else { return(null); } }
public override Statement process(Registers r, Block block) { //System.out.println("-- processing register set " + register + "@" + line); r.setValue(register, line, @value); // // if(value.isMultiple()) { // System.out.println("-- process multiple @" + register); // } // if(r.isAssignable(register, line)) { //System.out.println("-- assignment!"); return new Assignment(r.getTarget(register, line), @value); } else { return null; } }
public override Expression asExpression(Registers r) { bool transpose = false; Expression leftExpression = r.getKExpression(left, line); Expression rightExpression = r.getKExpression(right, line); if(((left | right) & 256) == 0) { transpose = r.getUpdated(left, line) > r.getUpdated(right, line); } else { transpose = rightExpression.getConstantIndex() < leftExpression.getConstantIndex(); } string op = !transpose ? "<" : ">"; Expression rtn = new BinaryExpression(op, !transpose ? leftExpression : rightExpression, !transpose ? rightExpression : leftExpression, Expression.PRECEDENCE_COMPARE, Expression.ASSOCIATIVITY_LEFT); if(_invert) { rtn = new UnaryExpression("not ", rtn, Expression.PRECEDENCE_UNARY); } return rtn; }
public override Expression asExpression(Registers r) { bool transpose = false; Expression leftExpression = r.getKExpression(left, line); Expression rightExpression = r.getKExpression(right, line); if (((left | right) & 256) == 0) { transpose = r.getUpdated(left, line) > r.getUpdated(right, line); } else { transpose = rightExpression.getConstantIndex() < leftExpression.getConstantIndex(); } string op = !transpose ? "<=" : ">="; Expression rtn = new BinaryExpression(op, !transpose ? leftExpression : rightExpression, !transpose ? rightExpression : leftExpression, Expression.PRECEDENCE_COMPARE, Expression.ASSOCIATIVITY_LEFT); if (_invert) { rtn = new UnaryExpression("not ", rtn, Expression.PRECEDENCE_UNARY); } return(rtn); }
public override Expression asExpression(Registers r) { return(new UnaryExpression("not ", branch.asExpression(r), Expression.PRECEDENCE_UNARY)); }
public override Statement process(Registers r, Block block) { return(new Assignment(target, @value)); }
public override Statement process(Registers r, Block block) { return(new Return(values)); }
public override Statement process(Registers r, Block block) { return new Assignment(new GlobalTarget(global), @value); }
abstract public Statement process(Registers r, Block block);
public abstract Expression asExpression(Registers r);
public override Expression asExpression(Registers r) { return(new ConstantExpression(new Constant(_invert ? LBoolean.LTRUE : LBoolean.LFALSE), -1)); }
public override Expression asExpression(Registers r) { return(new BinaryExpression("and", left.asExpression(r), right.asExpression(r), Expression.PRECEDENCE_AND, Expression.ASSOCIATIVITY_NONE)); }
public override Expression asExpression(Registers r) { bool transpose = false; string op = _invert ? "~=" : "=="; return new BinaryExpression(op, r.getKExpression(!transpose ? left : right, line), r.getKExpression(!transpose ? right : left, line), Expression.PRECEDENCE_COMPARE, Expression.ASSOCIATIVITY_LEFT); }
public override Statement process(Registers r, Block block) { return(new FunctionCallStatement(call)); }
public override Expression asExpression(Registers r) { return r.getExpression(test, line); }
public override Expression asExpression(Registers r) { return new ConstantExpression(new Constant(_invert ? LBoolean.LTRUE : LBoolean.LFALSE), -1); }
abstract public Expression asExpression(Registers r);
public override Statement process(Registers r, Block block) { //System.out.println("-- block " + begin + " .. " + end); Expression expr = null; int register = 0; for(; register < r.registers; register++) { if(r.getUpdated(register, branch.end - 1) == branch.end - 1) { expr = r.getValue(register, branch.end); break; } } if(d.code.op(branch.end - 2) == Op.LOADBOOL && d.code.C(branch.end - 2) != 0) { int target1 = d.code.A(branch.end - 2); if(d.code.op(branch.end - 3) == Op.JMP && d.code.sBx(branch.end - 3) == 2) { //System.out.println("-- Dropped boolean expression operand"); expr = r.getValue(target1, branch.end - 2); } else { expr = r.getValue(target1, branch.begin); } branch.useExpression(expr); if(r.isLocal(target1, branch.end - 1)) { return new Assignment(r.getTarget(target1, branch.end - 1), branch.asExpression(r)); } r.setValue(target1, branch.end - 1, branch.asExpression(r)); } else if(expr != null && target >= 0) { branch.useExpression(expr); if(r.isLocal(target, branch.end - 1)) { return new Assignment(r.getTarget(target, branch.end - 1), branch.asExpression(r)); } r.setValue(target, branch.end - 1, branch.asExpression(r)); //System.out.println("-- target = " + target + "@" + (branch.end - 1)); //.print(new Output()); //System.out.println(); } else { Console.WriteLine("-- fail " + (branch.end - 1)); Console.WriteLine(expr); Console.WriteLine(target); } return null; }
public override Statement process(unluac.decompile.Registers r, unluac.decompile.block.Block block) { return(_statement); }
public override Expression asExpression(Registers r) { return new BinaryExpression("or", left.asExpression(r), right.asExpression(r), Expression.PRECEDENCE_OR, Expression.ASSOCIATIVITY_NONE); }
public override Statement process(Registers r, Block block) { return new Assignment(assign.getFirstTarget(), expr); }
public override Expression asExpression(Registers r) { return(r.getExpression(test, line)); }
public override Statement process(Registers r, Block block) { return new Assignment(_target, _value); }
public override Statement process(Registers r, Block block) { r.setValue(testreg, branch.end - 1, setb.asExpression(r)); return null; }
public IfThenEndBlock(LFunction function, Branch branch, Registers r) : this(function, branch, null, r) { }
public override Expression asExpression(Registers r) { return new UnaryExpression("not ", branch.asExpression(r), Expression.PRECEDENCE_UNARY); }
public override Statement process(Registers r, Block block) { return new Return(values); }
public override Statement process(Registers r, Block block) { return(new Assignment(new GlobalTarget(global), @value)); }