Mirror of the JODE repository
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
jode/jode/CreateIfStatements.java

58 lines
1.9 KiB

package jode;
public class CreateIfStatements implements Transformation {
public InstructionHeader transform(InstructionHeader ifgoto) {
if (ifgoto.getFlowType() != ifgoto.IFGOTO ||
ifgoto.nextInstruction == null ||
ifgoto.getSuccessors()[1].getAddress() <=
ifgoto.getSuccessors()[0].getAddress())
return null;
InstructionHeader next = ifgoto.getSuccessors()[1];
InstructionHeader endBlock = next;
if (ifgoto.outer != next.outer) {
if (ifgoto.outer.endBlock != next)
return null;
next = null;
}
InstructionHeader thenStart = ifgoto.nextInstruction;
InstructionHeader thenEnd;
for (thenEnd = thenStart;
thenEnd != null && thenEnd.nextInstruction != next;
thenEnd = thenEnd.nextInstruction) {
}
if (thenEnd == null)
return null;
InstructionHeader elseStart = null;
InstructionHeader elseEnd = null;
if (next != null &&
thenEnd.getFlowType() == thenEnd.GOTO &&
thenEnd.successors[0].getAddress() > next.getAddress()) {
elseStart = next;
endBlock = next = thenEnd.successors[0];
if (ifgoto.outer != next.outer) {
if (ifgoto.outer.endBlock != next)
return null;
next = null;
}
for (elseEnd = elseStart;
elseEnd != null && elseEnd.nextInstruction != next;
elseEnd = elseEnd.nextInstruction) {
}
/* XXX return error or create if-then?
*/
if (elseEnd == null)
return null;
}
if(Decompiler.isVerbose)
System.err.print("i");
return new IfInstructionHeader
(ifgoto, elseStart != null, thenEnd, elseEnd, endBlock);
}
}