示例#1
0
        public override void Print(Output output)
        {
            output.Print("if ");

            m_branch.AsExpression(m_r).Print(output);

            output.Print(" then");
            output.PrintLine();

            output.IncreaseIndent();

            //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 (m_statements.Count == 1 && m_statements[0] is Break)
            {
                var b = m_statements[0] as Break;

                if (b.Target == m_loopback)
                {
                    output.DecreaseIndent();
                    return;
                }
            }

            Statement.PrintSequence(output, m_statements);

            output.DecreaseIndent();

            if (m_emptyElse)
            {
                output.PrintLine("else");
                output.PrintLine("end");
            }
        }
示例#2
0
        public override void Print(Output output)
        {
            output.Print("repeat");
            output.PrintLine();

            output.IncreaseIndent();

            Statement.PrintSequence(output, m_statements);

            output.DecreaseIndent();

            output.Print("until ");
            m_branch.AsExpression(m_r).Print(output);
        }
示例#3
0
        public override void Print(Output output)
        {
            output.Print("while ");

            m_branch.AsExpression(m_registers).Print(output);

            output.Print(" do");
            output.PrintLine();

            output.IncreaseIndent();

            Statement.PrintSequence(output, m_statements);

            output.DecreaseIndent();

            output.Print("end");
        }
示例#4
0
 public override Expression AsExpression(Registers registers)
 {
     return(Expression.MakeNOT(m_branch.AsExpression(registers)));
 }
示例#5
0
 public override Operation Process(Decompiler d)
 {
     return(new LambdaOperation(End - 1, (r, block) => {
         return new RegisterSet(End - 1, Target, Branch.AsExpression(r)).Process(r, block);
     }));
 }
示例#6
0
 public override Expression AsExpression(Registers registers)
 {
     return(Expression.MakeOR(m_left.AsExpression(registers), m_right.AsExpression(registers)));
 }
示例#7
0
        public override Operation Process(Decompiler d)
        {
            if (m_empty)
            {
                var expr = m_r.GetExpression(Branch.SetTarget, End);
                Branch.UseExpression(expr);

                return(new RegisterSet(End - 1, Branch.SetTarget, Branch.AsExpression(m_r)));
            }
            else if (m_assign != null)
            {
                Branch.UseExpression(m_assign.GetFirstValue());

                var target = m_assign.GetFirstTarget();
                var value  = GetValue();

                return(new LambdaOperation(End - 1, (r, block) => {
                    return new Assignment(target, value);
                }));
            }
            else
            {
                return(new LambdaOperation(End - 1, (r, block) => {
                    Expression expr = null;

                    var register = 0;

                    for (; register < r.NumRegisters; 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)
                    {
                        var target = d.Code.A(Branch.End - 2);

                        if (d.Code.Op(Branch.End - 3) == Op.JMP &&
                            d.Code.sBx(Branch.End - 3) == 2)
                        {
                            expr = r.GetValue(target, Branch.End - 2);
                        }
                        else
                        {
                            expr = r.GetValue(target, Branch.Begin);
                        }

                        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));
                    }
                    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));
                    }
                    else
                    {
                        Console.WriteLine("-- fail " + (Branch.End - 1));
                        Console.WriteLine(expr);
                        Console.WriteLine(Target);
                    }

                    return null;
                }));
            }
        }
示例#8
0
 public Expression GetValue()
 {
     return(Branch.AsExpression(m_r));
 }