fix: run code schrink after insn args simplify (#1838)

This commit is contained in:
Skylot
2023-04-24 22:10:02 +01:00
parent 7f3bd8c668
commit 54f83cee1c
4 changed files with 85 additions and 1 deletions
@@ -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;
}
@@ -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);
}
}
@@ -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: \" +");
}
}
@@ -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;-><init>()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;-><init>()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