fix: remove redundant wrapping for same arith operations (PR #559)
This commit is contained in:
@@ -25,4 +25,10 @@ public enum ArithOp {
|
||||
return this.symbol;
|
||||
}
|
||||
|
||||
public boolean noWrapWith(ArithOp other) {
|
||||
return (this == ADD && other == ADD)
|
||||
|| (this == MUL && other == MUL)
|
||||
|| (this == AND && other == AND)
|
||||
|| (this == OR && other == OR);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,8 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import jadx.core.dex.attributes.AFlag;
|
||||
import jadx.core.dex.instructions.ArithNode;
|
||||
import jadx.core.dex.instructions.InsnType;
|
||||
import jadx.core.dex.nodes.InsnNode;
|
||||
import jadx.core.utils.InsnUtils;
|
||||
|
||||
@@ -111,6 +113,12 @@ public abstract class InsnArg extends Typed {
|
||||
insn.add(AFlag.WRAPPED);
|
||||
InsnArg arg = wrapArg(insn);
|
||||
parent.setArg(i, arg);
|
||||
|
||||
if (insn.getType() == InsnType.ARITH && parent.getType() == InsnType.ARITH
|
||||
&& ((ArithNode) insn).getOp().noWrapWith(((ArithNode) parent).getOp())) {
|
||||
insn.add(AFlag.DONT_WRAP);
|
||||
}
|
||||
|
||||
return arg;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ import static org.hamcrest.MatcherAssert.assertThat;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import jadx.NotYetImplemented;
|
||||
import jadx.core.dex.nodes.ClassNode;
|
||||
import jadx.tests.api.IntegrationTest;
|
||||
|
||||
@@ -21,6 +20,22 @@ public class TestArith2 extends IntegrationTest {
|
||||
public int test2(int a, int b, int c) {
|
||||
return a + b + c;
|
||||
}
|
||||
|
||||
public boolean test3(boolean a, boolean b, boolean c) {
|
||||
return a | b | c;
|
||||
}
|
||||
|
||||
public boolean test4(boolean a, boolean b, boolean c) {
|
||||
return a & b & c;
|
||||
}
|
||||
|
||||
public int substract(int a, int b, int c) {
|
||||
return a - (b - c);
|
||||
}
|
||||
|
||||
public int divide(int a, int b, int c) {
|
||||
return a / (b / c);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -30,15 +45,20 @@ public class TestArith2 extends IntegrationTest {
|
||||
|
||||
assertThat(code, containsString("return (a + 2) * 3;"));
|
||||
assertThat(code, not(containsString("a + 2 * 3")));
|
||||
}
|
||||
|
||||
@Test
|
||||
@NotYetImplemented
|
||||
public void test2() {
|
||||
ClassNode cls = getClassNode(TestCls.class);
|
||||
String code = cls.getCode().toString();
|
||||
|
||||
assertThat(code, containsString("return a + b + c;"));
|
||||
assertThat(code, not(containsString("return (a + b) + c;")));
|
||||
|
||||
assertThat(code, containsString("return a | b | c;"));
|
||||
assertThat(code, not(containsString("return (a | b) | c;")));
|
||||
|
||||
assertThat(code, containsString("return a & b & c;"));
|
||||
assertThat(code, not(containsString("return (a & b) & c;")));
|
||||
|
||||
assertThat(code, containsString("return a - (b - c);"));
|
||||
assertThat(code, not(containsString("return a - b - c;")));
|
||||
|
||||
assertThat(code, containsString("return a / (b / c);"));
|
||||
assertThat(code, not(containsString("return a / b / c;")));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user