diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/InsnNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/InsnNode.java index 3d1ba4925..b9a292ca6 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/InsnNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/InsnNode.java @@ -259,6 +259,11 @@ public class InsnNode extends LineAttrNode { case STR_CONCAT: return true; + case SGET: + case IGET: + // TODO: allow to move final fields + return false; + default: return false; } 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 4ff834664..9516cd09e 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 @@ -72,7 +72,7 @@ public class SimplifyVisitor extends AbstractVisitor { changed = true; } } - if (changed) { + if (changed || mth.contains(AFlag.REQUEST_CODE_SHRINK)) { CodeShrinkVisitor.shrinkMethod(mth); } } @@ -121,6 +121,7 @@ public class SimplifyVisitor extends AbstractVisitor { } if (changed) { insn.rebindArgs(); + mth.add(AFlag.REQUEST_CODE_SHRINK); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldUsageMove.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldUsageMove.java new file mode 100644 index 000000000..a7139cae5 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestFieldUsageMove.java @@ -0,0 +1,40 @@ +package jadx.tests.integration.others; + +import org.junit.jupiter.api.Test; + +import jadx.tests.api.SmaliTest; +import jadx.tests.api.extensions.profiles.TestProfile; +import jadx.tests.api.extensions.profiles.TestWithProfiles; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; + +public class TestFieldUsageMove extends SmaliTest { + + public static class TestCls { + public static void test(Object obj) { + if (obj instanceof Boolean) { + System.out.println("Boolean: " + obj); + } + if (obj instanceof Float) { + System.out.println("Float: " + obj); + } + } + } + + @TestWithProfiles(TestProfile.D8_J11) + public void test() { + noDebugInfo(); + assertThat(getClassNode(TestCls.class)) + .code() + .containsOne("System.out.println(\"Boolean: \" +") + .containsOne("System.out.println(\"Float: \" +"); + } + + @Test + public void testSmali() { + assertThat(getClassNodeFromSmali()) + .code() + .containsOne("System.out.println(\"Boolean: \" +") + .containsOne("System.out.println(\"Float: \" +"); + } +} diff --git a/jadx-core/src/test/smali/others/TestFieldUsageMove.smali b/jadx-core/src/test/smali/others/TestFieldUsageMove.smali new file mode 100644 index 000000000..83189d775 --- /dev/null +++ b/jadx-core/src/test/smali/others/TestFieldUsageMove.smali @@ -0,0 +1,38 @@ +.class public Lothers/TestFieldUsageMove; +.super Ljava/lang/Object; + +.method public static test(Ljava/lang/Object;)V + .registers 4 + + .line 4 + instance-of v0, p0, Ljava/lang/Boolean; + if-eqz v0, :cond_1a + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + new-instance v1, Ljava/lang/StringBuilder; + invoke-direct {v1}, Ljava/lang/StringBuilder;->()V + const-string v2, "Boolean: " + invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; + invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v1 + invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + .line 5 + :cond_1a + instance-of v0, p0, Ljava/lang/Float; + if-eqz v0, :cond_34 + sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; + new-instance v1, Ljava/lang/StringBuilder; + invoke-direct {v1}, Ljava/lang/StringBuilder;->()V + const-string v2, "Float: " + invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; + invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object p0 + + invoke-virtual {v0, p0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V + + .line 6 + :cond_34 + return-void +.end method