fix: run code schrink after insn args simplify (#1838)
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user