From 058e4c9fd77fde0c2f681ba59522cfca8599805c Mon Sep 17 00:00:00 2001 From: Ahmed Ashour Date: Thu, 4 Apr 2019 14:22:05 +0200 Subject: [PATCH] fix: remove redundant wrapping for same arith operations (PR #559) --- .../jadx/core/dex/instructions/ArithOp.java | 6 ++++ .../core/dex/instructions/args/InsnArg.java | 8 +++++ .../tests/integration/arith/TestArith2.java | 36 ++++++++++++++----- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/ArithOp.java b/jadx-core/src/main/java/jadx/core/dex/instructions/ArithOp.java index 2806fa2e8..e7ec1f135 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/ArithOp.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/ArithOp.java @@ -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); + } } diff --git a/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java index 7daa6926e..59090d28b 100644 --- a/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java +++ b/jadx-core/src/main/java/jadx/core/dex/instructions/args/InsnArg.java @@ -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; } diff --git a/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith2.java b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith2.java index 5528bd702..5da553b3e 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arith/TestArith2.java @@ -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;"))); } }