Search in sources :

Example 6 with Assignment

use of org.candle.decompiler.intermediate.expression.Assignment in project candle-decompiler by bradsdavis.

the class ConstantArrayCompressor method visitStatementIntermediate.

@Override
public void visitStatementIntermediate(StatementIntermediate line) {
    // first, look for the
    Assignment assignment = extractConstantArrayAssignment(line.getExpression());
    if (assignment == null) {
        return;
    }
    // at this point, we know both the statement is an assignment, and that the left assignment is to a constant array value.
    // find the one that is right before the array assignment.
    Declaration declaration = extractNextDeclaration(line);
    // if we didn't find the declaration, this must not be the constant array assignment proceeding the declaration.
    if (declaration == null) {
        return;
    }
    // check the right hand of the declaration...
    if (!(declaration.getAssignment().getRightHandSide() instanceof NewConstantArrayInstance)) {
        return;
    }
    NewConstantArrayInstance ncai = (NewConstantArrayInstance) declaration.getAssignment().getRightHandSide();
    Expression countExpression = ncai.getCount();
    AbstractIntermediate current = line;
    Map<Integer, Expression> values = new HashMap<Integer, Expression>();
    collectConstantAssignments(current, values);
    // create a new array...
    Integer count = toInteger(countExpression);
    List<Expression> expressions = new ArrayList<Expression>(count);
    for (int i = 0, j = count; i < j; i++) {
        Expression exp = null;
        if (values.containsKey(i)) {
            exp = values.get(i);
        } else {
            exp = new Resolved(ncai.getInstructionHandle(), Type.NULL, "null");
        }
        expressions.add(i, exp);
    }
    // ok, we have the stack... now we need to just create a new expression.
    // create the contant...
    ConstantArray constantArray = new ConstantArray(declaration.getAssignment().getRightHandSide().getInstructionHandle(), expressions);
    declaration.getAssignment().setRightHandSide(constantArray);
    // excellent.  we have reordered the statements into the appropriate ContantArray assignment.  Now, we need to remove the dead nodes and heal the graph.
    AbstractIntermediate next = Graphs.successorListOf(igc.getGraph(), line).get(0);
    // loop through the dead elements...
    // we know the number of dead items is equal to the number of values we found.
    healGraph(line, next, values.size());
}
Also used : AbstractIntermediate(org.candle.decompiler.intermediate.code.AbstractIntermediate) ConstantArray(org.candle.decompiler.intermediate.expression.ConstantArray) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) NewConstantArrayInstance(org.candle.decompiler.intermediate.expression.NewConstantArrayInstance) Assignment(org.candle.decompiler.intermediate.expression.Assignment) Expression(org.candle.decompiler.intermediate.expression.Expression) Resolved(org.candle.decompiler.intermediate.expression.Resolved) Declaration(org.candle.decompiler.intermediate.expression.Declaration)

Example 7 with Assignment

use of org.candle.decompiler.intermediate.expression.Assignment in project candle-decompiler by bradsdavis.

the class ConstantArrayCompressor method collectConstantAssignments.

public void collectConstantAssignments(AbstractIntermediate current, Map<Integer, Expression> assignments) {
    StatementIntermediate si = (StatementIntermediate) current;
    // get the assignment...
    Assignment assignment = extractConstantArrayAssignment(si.getExpression());
    if (assignment == null) {
        return;
    }
    Expression right = assignment.getRightHandSide();
    ArrayAccess apr = (ArrayAccess) assignment.getLeftHandSide();
    assignments.put(toInteger(apr.getIndex()), right);
    List<AbstractIntermediate> predecessor = Graphs.predecessorListOf(igc.getGraph(), current);
    if (predecessor.size() != 1) {
        return;
    }
    if (!(predecessor.get(0) instanceof StatementIntermediate)) {
        return;
    }
    for (AbstractIntermediate a : predecessor) {
        collectConstantAssignments(a, assignments);
    }
}
Also used : Assignment(org.candle.decompiler.intermediate.expression.Assignment) AbstractIntermediate(org.candle.decompiler.intermediate.code.AbstractIntermediate) ArrayAccess(org.candle.decompiler.intermediate.expression.ArrayAccess) Expression(org.candle.decompiler.intermediate.expression.Expression) StatementIntermediate(org.candle.decompiler.intermediate.code.StatementIntermediate)

Aggregations

Assignment (org.candle.decompiler.intermediate.expression.Assignment)7 Expression (org.candle.decompiler.intermediate.expression.Expression)6 StatementIntermediate (org.candle.decompiler.intermediate.code.StatementIntermediate)5 TypedExpression (org.candle.decompiler.intermediate.expression.TypedExpression)4 ArrayAccess (org.candle.decompiler.intermediate.expression.ArrayAccess)3 IntermediateVariable (org.candle.decompiler.intermediate.IntermediateVariable)2 AbstractIntermediate (org.candle.decompiler.intermediate.code.AbstractIntermediate)2 ArithmeticType (org.candle.decompiler.intermediate.expression.ArithmeticType)2 Declaration (org.candle.decompiler.intermediate.expression.Declaration)2 GeneratedVariable (org.candle.decompiler.intermediate.expression.GeneratedVariable)2 NewConstantArrayInstance (org.candle.decompiler.intermediate.expression.NewConstantArrayInstance)2 OperationType (org.candle.decompiler.intermediate.expression.OperationType)2 Variable (org.candle.decompiler.intermediate.expression.Variable)2 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 Field (org.apache.bcel.classfile.Field)1 ConstantArray (org.candle.decompiler.intermediate.expression.ConstantArray)1 FieldAccess (org.candle.decompiler.intermediate.expression.FieldAccess)1 Resolved (org.candle.decompiler.intermediate.expression.Resolved)1