diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/SimplifyVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/SimplifyVisitor.java index b8b81ab07..3603958f7 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/SimplifyVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/SimplifyVisitor.java @@ -49,12 +49,36 @@ public class SimplifyVisitor extends AbstractVisitor { for (int i = 0; i < list.size(); i++) { InsnNode modInsn = simplifyInsn(mth, list.get(i)); if (modInsn != null) { + if (i != 0 && modInsn.contains(AFlag.ARITH_ONEARG)) { + + InsnNode mergedNode = simplifyOneArgConsecutive( + list.get(i - 1), list.get(i), (ArithNode) modInsn); + + if (mergedNode != null) { + list.remove(i - 1); + modInsn = mergedNode; + i--; + } + } list.set(i, modInsn); } } } } + private static InsnNode simplifyOneArgConsecutive(InsnNode insn1, InsnNode insn2, ArithNode modInsn) { + if (insn1.getType() == InsnType.IGET + && insn2.getType() == InsnType.IPUT + && insn1.getResult().getSVar().getUseCount() == 2 + && insn2.getArg(1).equals(insn1.getResult())) { + + FieldInfo field = (FieldInfo) ((IndexInsnNode) insn2).getIndex(); + FieldArg fArg = new FieldArg(field, new InsnWrapArg(insn1)); + return new ArithNode(modInsn.getOp(), fArg, modInsn.getArg(1)); + } + return null; + } + private static InsnNode simplifyInsn(MethodNode mth, InsnNode insn) { if (insn.contains(AFlag.DONT_GENERATE)) { return null; diff --git a/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement2.java b/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement2.java index 72820efba..5a21259ec 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/arith/TestFieldIncrement2.java @@ -2,7 +2,6 @@ package jadx.tests.integration.arith; import org.junit.jupiter.api.Test; -import jadx.NotYetImplemented; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; @@ -33,15 +32,6 @@ public class TestFieldIncrement2 extends IntegrationTest { String code = cls.getCode().toString(); assertThat(code, containsString("this.a.f += n;")); - assertThat(code, containsString("a2.f *= n;")); - } - - @Test - @NotYetImplemented - public void test2() { - ClassNode cls = getClassNode(TestCls.class); - String code = cls.getCode().toString(); - assertThat(code, containsString("this.a.f *= n;")); } }