diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java index fb653959f..53b2eb2da 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/LoopRegionVisitor.java @@ -125,6 +125,7 @@ public class LoopRegionVisitor extends AbstractVisitor implements IRegionVisitor // all checks passed initInsn.add(AFlag.DONT_GENERATE); incrInsn.add(AFlag.DONT_GENERATE); + LoopType arrForEach = checkArrayForEach(mth, loopRegion, initInsn, incrInsn, condition); if (arrForEach != null) { loopRegion.setType(arrForEach); @@ -281,6 +282,8 @@ public class LoopRegionVisitor extends AbstractVisitor implements IRegionVisitor } assignInsn.add(AFlag.DONT_GENERATE); + assignInsn.getResult().add(AFlag.DONT_GENERATE); + for (InsnNode insnNode : toSkip) { insnNode.add(AFlag.DONT_GENERATE); } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/CollectUsageRegionVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/CollectUsageRegionVisitor.java index bc35718c2..b22f72b31 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/CollectUsageRegionVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/CollectUsageRegionVisitor.java @@ -18,13 +18,8 @@ import jadx.core.dex.regions.loops.LoopType; import jadx.core.dex.visitors.regions.TracedRegionVisitor; class CollectUsageRegionVisitor extends TracedRegionVisitor { - private final List args; - private final Map usageMap; - - public CollectUsageRegionVisitor() { - this.usageMap = new LinkedHashMap<>(); - this.args = new ArrayList<>(); - } + private final List args = new ArrayList<>(); + private final Map usageMap = new LinkedHashMap<>(); public Map getUsageMap() { return usageMap; @@ -37,9 +32,6 @@ class CollectUsageRegionVisitor extends TracedRegionVisitor { int len = block.getInstructions().size(); for (int i = 0; i < len; i++) { InsnNode insn = block.getInstructions().get(i); - if (insn.contains(AFlag.DONT_GENERATE)) { - continue; - } processInsn(insn, usePlace); } } @@ -73,11 +65,10 @@ class CollectUsageRegionVisitor extends TracedRegionVisitor { args.clear(); insn.getRegisterArgs(args); for (RegisterArg arg : args) { - if (arg.contains(AFlag.DONT_GENERATE)) { - continue; + if (!arg.contains(AFlag.DONT_GENERATE)) { + VarUsage usage = getUsage(arg.getSVar()); + usage.getUses().add(usePlace); } - VarUsage usage = getUsage(arg.getSVar()); - usage.getUses().add(usePlace); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables7.java b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables7.java deleted file mode 100644 index b25cb1a4d..000000000 --- a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariables7.java +++ /dev/null @@ -1,38 +0,0 @@ -package jadx.tests.integration.variables; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.jupiter.api.Test; - -import jadx.NotYetImplemented; -import jadx.core.dex.nodes.ClassNode; -import jadx.tests.api.IntegrationTest; - -public class TestVariables7 extends IntegrationTest { - - public static class TestCls { - - public void test() { - List list; - synchronized (this) { - list = new ArrayList(); - } - for (Object o : list) { - System.out.println(o); - } - } - } - - @Test - @NotYetImplemented - public void test() { - ClassNode cls = getClassNode(TestCls.class); - String code = cls.getCode().toString(); - - assertThat(code, containsString(" list = new ArrayList")); - } -} diff --git a/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesUsageWithLoops.java b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesUsageWithLoops.java new file mode 100644 index 000000000..321ee22f7 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/variables/TestVariablesUsageWithLoops.java @@ -0,0 +1,57 @@ +package jadx.tests.integration.variables; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; + +public class TestVariablesUsageWithLoops extends IntegrationTest { + + public static class TestEnhancedFor { + + public void test() { + List list; + synchronized (this) { + list = new ArrayList(); + } + for (Object o : list) { + System.out.println(o); + } + } + } + + @Test + public void testEnhancedFor() { + ClassNode cls = getClassNode(TestEnhancedFor.class); + String code = cls.getCode().toString(); + + assertThat(code, containsString(" list = new ArrayList")); + } + + public static class TestForLoop { + + public void test() { + List list; + synchronized (this) { + list = new ArrayList(); + } + for (int i = 0; i < list.size(); i++) { + System.out.println(i); + } + } + } + + @Test + public void testForLoop() { + ClassNode cls = getClassNode(TestForLoop.class); + String code = cls.getCode().toString(); + + assertThat(code, containsString(" list = new ArrayList")); + } +}