提交 e6e8f636 编写于 作者: A Ahmed Ashour 提交者: skylot

fix: variable usage with enhanced for loop (#535) (PR #547)

上级 3970fce5
......@@ -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);
}
......
......@@ -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);
}
}
......
......@@ -8,13 +8,12 @@ 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 class TestVariablesUsageWithLoops extends IntegrationTest {
public static class TestCls {
public static class TestEnhancedFor {
public void test() {
List list;
......@@ -28,9 +27,29 @@ public class TestVariables7 extends IntegrationTest {
}
@Test
@NotYetImplemented
public void test() {
ClassNode cls = getClassNode(TestCls.class);
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"));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册