From ce7101be8888e281800481639a5dbaeacc9b0ffb Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 28 Jun 2014 15:39:35 +0400 Subject: [PATCH] core: always inline 'this' (issue #10) --- .../jadx/core/dex/visitors/CodeShrinker.java | 6 ++- .../internal/usethis/TestInlineThis.java | 42 +++++++++++++++++++ .../{ => usethis}/TestRedundantThis.java | 3 +- 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 jadx-core/src/test/java/jadx/tests/internal/usethis/TestInlineThis.java rename jadx-core/src/test/java/jadx/tests/internal/{ => usethis}/TestRedundantThis.java (95%) 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 96323ea5..64c64fd5 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 @@ -192,7 +192,11 @@ public class CodeShrinker extends AbstractVisitor { // continue; // } SSAVar sVar = arg.getSVar(); - if (sVar.getAssign() == null || sVar.getVariableUseCount() != 1) { + if (sVar.getAssign() == null) { + continue; + } + // allow inline only one use arg or 'this' + if (sVar.getVariableUseCount() != 1 && !arg.isThis()) { continue; } InsnNode assignInsn = sVar.getAssign().getParentInsn(); diff --git a/jadx-core/src/test/java/jadx/tests/internal/usethis/TestInlineThis.java b/jadx-core/src/test/java/jadx/tests/internal/usethis/TestInlineThis.java new file mode 100644 index 00000000..1cec1077 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/internal/usethis/TestInlineThis.java @@ -0,0 +1,42 @@ +package jadx.tests.internal.usethis; + +import jadx.api.InternalJadxTest; +import jadx.core.dex.nodes.ClassNode; + +import org.junit.Test; + +import static jadx.tests.utils.JadxMatchers.containsOne; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; + +public class TestInlineThis extends InternalJadxTest { + + public static class TestCls { + public int field; + + private void test() { + TestCls something = this; + something.method(); + something.field = 123; + } + + private void method() { + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + System.out.println(code); + + assertThat(code, not(containsString("something"))); + assertThat(code, not(containsString("something.method()"))); + assertThat(code, not(containsString("something.field"))); + assertThat(code, not(containsString("= this"))); + + assertThat(code, containsOne("this.field = 123;")); + assertThat(code, containsOne("method();")); + } +} diff --git a/jadx-core/src/test/java/jadx/tests/internal/TestRedundantThis.java b/jadx-core/src/test/java/jadx/tests/internal/usethis/TestRedundantThis.java similarity index 95% rename from jadx-core/src/test/java/jadx/tests/internal/TestRedundantThis.java rename to jadx-core/src/test/java/jadx/tests/internal/usethis/TestRedundantThis.java index f2ccda96..8c7a45c6 100644 --- a/jadx-core/src/test/java/jadx/tests/internal/TestRedundantThis.java +++ b/jadx-core/src/test/java/jadx/tests/internal/usethis/TestRedundantThis.java @@ -1,4 +1,4 @@ -package jadx.tests.internal; +package jadx.tests.internal.usethis; import jadx.api.InternalJadxTest; import jadx.core.dex.nodes.ClassNode; @@ -30,7 +30,6 @@ public class TestRedundantThis extends InternalJadxTest { // @Test public void test() { ClassNode cls = getClassNode(TestCls.class); - String code = cls.getCode().toString(); assertThat(code, not(containsString("this.f1();"))); -- GitLab