diff --git a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java index e6b63a2d3..786d0a63e 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/MethodGen.java @@ -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; } diff --git a/jadx-core/src/test/java/jadx/tests/integration/fallback/TestFallbackManyNops.java b/jadx-core/src/test/java/jadx/tests/integration/fallback/TestFallbackManyNops.java new file mode 100644 index 000000000..54d72a3be --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/fallback/TestFallbackManyNops.java @@ -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"))); + } +} diff --git a/jadx-core/src/test/smali/fallback/TestFallbackManyNops.smali b/jadx-core/src/test/smali/fallback/TestFallbackManyNops.smali new file mode 100644 index 000000000..1c158321e --- /dev/null +++ b/jadx-core/src/test/smali/fallback/TestFallbackManyNops.smali @@ -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