Пример #1
0
        public override Operation Process(Decompiler d)
        {
            if (m_statements.Count == 1)
            {
                var statement = m_statements[0];

                if (statement is Assignment)
                {
                    var assignment = statement as Assignment;

                    if (assignment.GetArity() == 1)
                    {
                        if (m_branch is TestNode)
                        {
                            var node = m_branch as TestNode;
                            var decl = m_r.GetDeclaration(node.Test, node.Line);

                            if (assignment.GetFirstTarget().IsDeclaration(decl))
                            {
                                var left  = new LocalVariable(decl);
                                var right = assignment.GetFirstValue();

                                var expr = (node.Inverted)
                                    ? Expression.MakeOR(left, right)
                                    : Expression.MakeAND(left, right);

                                return(new LambdaOperation(End - 1, (r, block) => {
                                    return new Assignment(assignment.GetFirstTarget(), expr);
                                }));
                            }
                        }
                    }
                }
            }
            else if (m_statements.Count == 0 && m_stack != null)
            {
                var test = m_branch.GetRegister();

                if (test < 0)
                {
                    for (int reg = 0; reg < m_r.NumRegisters; reg++)
                    {
                        if (m_r.GetUpdated(reg, m_branch.End - 1) >= m_branch.Begin)
                        {
                            if (test >= 0)
                            {
                                test = -1;
                                break;
                            }

                            test = reg;
                        }
                    }
                }

                if (test >= 0)
                {
                    if (m_r.GetUpdated(test, m_branch.End - 1) >= m_branch.Begin)
                    {
                        var right = m_r.GetValue(test, m_branch.End);
                        var setb  = d.PopSetCondition(m_stack, m_stack.Peek().End, test);

                        setb.UseExpression(right);

                        var testReg = test;

                        return(new LambdaOperation(End - 1, (r, block) => {
                            r.SetValue(testReg, m_branch.End - 1, setb.AsExpression(r));
                            return null;
                        }));
                    }
                }
            }

            return(base.Process(d));
        }