From 33c5e0827ac32570d3567744b855beb3a2acb02b Mon Sep 17 00:00:00 2001 From: Skylot Date: Tue, 29 Jul 2014 22:55:17 +0400 Subject: [PATCH] core: always check arguments before inline --- .../jadx/core/dex/visitors/CodeShrinker.java | 13 ++--- .../internal/inline/TestInlineInLoop.java | 48 +++++++++++++++++++ 2 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 jadx-core/src/test/java/jadx/tests/internal/inline/TestInlineInLoop.java diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/CodeShrinker.java b/jadx-core/src/main/java/jadx/core/dex/visitors/CodeShrinker.java index 64c64fd5..c1f8fc0f 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/CodeShrinker.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/CodeShrinker.java @@ -87,7 +87,8 @@ public class CodeShrinker extends AbstractVisitor { } public WrapInfo checkInline(int assignPos, RegisterArg arg) { - if (assignPos >= inlineBorder || !canMove(assignPos, inlineBorder)) { + if (!arg.isThis() + && (assignPos >= inlineBorder || !canMove(assignPos, inlineBorder))) { return null; } inlineBorder = assignPos; @@ -205,13 +206,9 @@ public class CodeShrinker extends AbstractVisitor { } int assignPos = insnList.getIndex(assignInsn); if (assignPos != -1) { - if (assignInsn.canReorder()) { - wrapList.add(argsInfo.inline(assignPos, arg)); - } else { - WrapInfo wrapInfo = argsInfo.checkInline(assignPos, arg); - if (wrapInfo != null) { - wrapList.add(wrapInfo); - } + WrapInfo wrapInfo = argsInfo.checkInline(assignPos, arg); + if (wrapInfo != null) { + wrapList.add(wrapInfo); } } else { // another block diff --git a/jadx-core/src/test/java/jadx/tests/internal/inline/TestInlineInLoop.java b/jadx-core/src/test/java/jadx/tests/internal/inline/TestInlineInLoop.java new file mode 100644 index 00000000..ce3dbb10 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/internal/inline/TestInlineInLoop.java @@ -0,0 +1,48 @@ +package jadx.tests.internal.inline; + +import jadx.api.InternalJadxTest; +import jadx.core.dex.nodes.ClassNode; + +import org.junit.Test; + +import static jadx.tests.utils.JadxMatchers.containsOne; +import static jadx.tests.utils.JadxMatchers.countString; +import static org.junit.Assert.assertThat; + +public class TestInlineInLoop extends InternalJadxTest { + + public static class TestCls { + public static void main(String[] args) throws Exception { + int a = 0; + int b = 4; + int c = 0; + while (a < 12) { + if (b + a < 9 && b < 8) { + if (b >= 2 && a > -1 && b < 6) { + System.out.println("OK"); + c = b + 1; + } + c = b; + } + c = b; + b++; + b = c; + a++; + } + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + System.out.println(code); + + assertThat(code, containsOne("int c")); + assertThat(code, containsOne("c = b + 1")); + assertThat(code, countString(2, "c = b;")); + assertThat(code, containsOne("b++;")); + assertThat(code, containsOne("b = c")); + assertThat(code, containsOne("a++;")); + } +} -- GitLab