@@ -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);
|
||||
}
|
||||
|
||||
+5
-14
@@ -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<RegisterArg> args;
|
||||
private final Map<SSAVar, VarUsage> usageMap;
|
||||
|
||||
public CollectUsageRegionVisitor() {
|
||||
this.usageMap = new LinkedHashMap<>();
|
||||
this.args = new ArrayList<>();
|
||||
}
|
||||
private final List<RegisterArg> args = new ArrayList<>();
|
||||
private final Map<SSAVar, VarUsage> usageMap = new LinkedHashMap<>();
|
||||
|
||||
public Map<SSAVar, VarUsage> 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
}
|
||||
+57
@@ -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"));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user