Commit 4ace552a authored by Skylot's avatar Skylot

core: fix duplicate cast

parent b61daaed
package jadx.core.dex.visitors.typeresolver; package jadx.core.dex.visitors.typeresolver;
import jadx.core.dex.attributes.BlockRegState; import jadx.core.dex.attributes.BlockRegState;
import jadx.core.dex.instructions.IndexInsnNode;
import jadx.core.dex.instructions.InsnType;
import jadx.core.dex.instructions.args.ArgType;
import jadx.core.dex.instructions.args.InsnArg; import jadx.core.dex.instructions.args.InsnArg;
import jadx.core.dex.instructions.args.RegisterArg; import jadx.core.dex.instructions.args.RegisterArg;
import jadx.core.dex.nodes.BlockNode; import jadx.core.dex.nodes.BlockNode;
...@@ -20,8 +17,6 @@ public class TypeResolver extends AbstractVisitor { ...@@ -20,8 +17,6 @@ public class TypeResolver extends AbstractVisitor {
if (mth.isNoCode()) { if (mth.isNoCode()) {
return; return;
} }
prepare(mth);
visitBlocks(mth); visitBlocks(mth);
visitEdges(mth); visitEdges(mth);
...@@ -32,20 +27,6 @@ public class TypeResolver extends AbstractVisitor { ...@@ -32,20 +27,6 @@ public class TypeResolver extends AbstractVisitor {
} }
} }
/**
* Check argument types (can be broken after merging debug info)
*/
private static void prepare(MethodNode mth) {
for (BlockNode block : mth.getBasicBlocks()) {
for (InsnNode insn : block.getInstructions()) {
if (insn.getType() == InsnType.CHECK_CAST) {
ArgType castType = (ArgType) ((IndexInsnNode) insn).getIndex();
insn.getResult().getTypedVar().forceSetType(castType);
}
}
}
}
private static void visitBlocks(MethodNode mth) { private static void visitBlocks(MethodNode mth) {
for (BlockNode block : mth.getBasicBlocks()) { for (BlockNode block : mth.getBasicBlocks()) {
BlockRegState state = new BlockRegState(mth); BlockRegState state = new BlockRegState(mth);
......
package jadx.core.dex.visitors.typeresolver.finish; package jadx.core.dex.visitors.typeresolver.finish;
import jadx.core.dex.info.MethodInfo; import jadx.core.dex.info.MethodInfo;
import jadx.core.dex.instructions.IndexInsnNode;
import jadx.core.dex.instructions.InvokeNode; import jadx.core.dex.instructions.InvokeNode;
import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.instructions.args.ArgType;
import jadx.core.dex.instructions.args.InsnArg; import jadx.core.dex.instructions.args.InsnArg;
...@@ -85,6 +86,13 @@ public class PostTypeResolver { ...@@ -85,6 +86,13 @@ public class PostTypeResolver {
return change; return change;
} }
case CHECK_CAST: {
ArgType castType = (ArgType) ((IndexInsnNode) insn).getIndex();
// workaround for compiler bug (see TestDuplicateCast)
insn.getResult().getTypedVar().forceSetType(castType);
return true;
}
default: default:
break; break;
} }
......
...@@ -9,12 +9,18 @@ import jadx.core.dex.nodes.MethodNode; ...@@ -9,12 +9,18 @@ import jadx.core.dex.nodes.MethodNode;
import java.util.List; import java.util.List;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
/**
* Test duplicate 'check-cast' instruction produced because of bug in javac:
* http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6246854
*/
public class TestDuplicateCast extends InternalJadxTest { public class TestDuplicateCast extends InternalJadxTest {
public static class TestCls { public static class TestCls {
...@@ -23,7 +29,7 @@ public class TestDuplicateCast extends InternalJadxTest { ...@@ -23,7 +29,7 @@ public class TestDuplicateCast extends InternalJadxTest {
} }
} }
//@Test @Test
public void test() { public void test() {
ClassNode cls = getClassNode(TestCls.class); ClassNode cls = getClassNode(TestCls.class);
MethodNode mth = getMethod(cls, "method"); MethodNode mth = getMethod(cls, "method");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment