Skip to content

Commit

Permalink
Simplify boolean conditions
Browse files Browse the repository at this point in the history
  • Loading branch information
skylot committed Jun 17, 2013
1 parent d6a468f commit 5a40d96
Showing 1 changed file with 33 additions and 17 deletions.
50 changes: 33 additions & 17 deletions src/main/java/jadx/codegen/RegionGen.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import jadx.dex.instructions.SwitchNode;
import jadx.dex.instructions.args.ArgType;
import jadx.dex.instructions.args.InsnArg;
import jadx.dex.instructions.args.PrimitiveType;
import jadx.dex.instructions.args.LiteralArg;
import jadx.dex.instructions.args.RegisterArg;
import jadx.dex.nodes.IBlock;
import jadx.dex.nodes.IContainer;
Expand Down Expand Up @@ -158,27 +158,43 @@ private void makeSynchronizedRegion(SynchronizedRegion cont, CodeWriter code) th
}

private String makeCondition(IfNode insn) throws CodegenException {
String simple = simplifyCondition(insn);
if (simple != null)
return simple;

String second;
IfOp op = insn.getOp();
if (insn.isZeroCmp()) {
ArgType type = insn.getArg(0).getType();
if (type.getPrimitiveType() == PrimitiveType.BOOLEAN) {
if (op == IfOp.EQ) {
// == false
return "(!" + arg(insn.getArg(0)) + ")";
} else if (op == IfOp.NE) {
// == true
return "(" + arg(insn.getArg(0)) + ")";
}
LOG.warn(ErrorsCounter.formatErrorMsg(mth, "Unsupported boolean condition " + op.getSymbol()));
}
second = arg(InsnArg.lit(0, type));
second = arg(InsnArg.lit(0, insn.getArg(0).getType()));
} else {
second = arg(insn.getArg(1));
}
return "(" + arg(insn.getArg(0)) + " "
+ op.getSymbol() + " "
+ second + ")";
return "(" + arg(insn.getArg(0)) + " " + insn.getOp().getSymbol() + " " + second + ")";
}

private String simplifyCondition(IfNode insn) throws CodegenException {
InsnArg firstArg = insn.getArg(0);
if (firstArg.getType().equals(ArgType.BOOLEAN)) {
IfOp op = insn.getOp();
if (insn.isZeroCmp()) {
op = op.invert();
} else {
InsnArg secondArg = insn.getArg(1);
if (!secondArg.isLiteral() || !secondArg.getType().equals(ArgType.BOOLEAN))
return null;

LiteralArg lit = (LiteralArg) secondArg;
if (lit.getLiteral() == 0)
op = op.invert();
}

if (op == IfOp.EQ) {
return "(" + arg(firstArg) + ")"; // == true
} else if (op == IfOp.NE) {
return "(!" + arg(firstArg) + ")"; // != true
}
LOG.warn(ErrorsCounter.formatErrorMsg(mth, "Unsupported boolean condition " + op.getSymbol()));
}
return null;
}

private CodeWriter makeSwitch(SwitchRegion sw, CodeWriter code) throws CodegenException {
Expand Down

0 comments on commit 5a40d96

Please sign in to comment.