fix: do not count nop instructions when considering methods for fallback mode printing (#1038) (PR #1039)

This commit is contained in:
Jonas Konrad
2020-12-01 11:39:48 +01:00
committed by GitHub
parent 02bfe63245
commit 5c75f249c7
3 changed files with 151 additions and 1 deletions
@@ -3,6 +3,8 @@ package jadx.core.codegen;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -290,7 +292,11 @@ public class MethodGen {
code.startLine("// Can't load method instructions.");
return;
}
if (insnArr.length > 100) {
long insnCountEstimate = Stream.of(insnArr)
.filter(Objects::nonNull)
.filter(insn -> insn.getType() != InsnType.NOP)
.count();
if (insnCountEstimate > 100) {
code.startLine("// Method dump skipped, instructions count: " + insnArr.length);
return;
}
@@ -0,0 +1,27 @@
package jadx.tests.integration.fallback;
import org.junit.jupiter.api.Test;
import jadx.core.dex.nodes.ClassNode;
import jadx.tests.api.SmaliTest;
import static jadx.tests.api.utils.JadxMatchers.containsOne;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
public class TestFallbackManyNops extends SmaliTest {
@Test
public void test() {
setFallback();
disableCompilation();
ClassNode cls = getClassNodeFromSmali();
String code = cls.getCode().toString();
assertThat(code, containsString("public static void test() {"));
assertThat(code, containsOne("return"));
assertThat(code, not(containsString("Method dump skipped")));
}
}
@@ -0,0 +1,117 @@
.class public Lfallback/TestFallbackManyNops;
.super Ljava/lang/Object;
.method public static test()V
.registers 1
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
return-void
.end method