core: fix duplicate cast
This commit is contained in:
@@ -1,9 +1,6 @@
|
||||
package jadx.core.dex.visitors.typeresolver;
|
||||
|
||||
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.RegisterArg;
|
||||
import jadx.core.dex.nodes.BlockNode;
|
||||
@@ -20,8 +17,6 @@ public class TypeResolver extends AbstractVisitor {
|
||||
if (mth.isNoCode()) {
|
||||
return;
|
||||
}
|
||||
prepare(mth);
|
||||
|
||||
visitBlocks(mth);
|
||||
visitEdges(mth);
|
||||
|
||||
@@ -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) {
|
||||
for (BlockNode block : mth.getBasicBlocks()) {
|
||||
BlockRegState state = new BlockRegState(mth);
|
||||
|
||||
+8
@@ -1,6 +1,7 @@
|
||||
package jadx.core.dex.visitors.typeresolver.finish;
|
||||
|
||||
import jadx.core.dex.info.MethodInfo;
|
||||
import jadx.core.dex.instructions.IndexInsnNode;
|
||||
import jadx.core.dex.instructions.InvokeNode;
|
||||
import jadx.core.dex.instructions.args.ArgType;
|
||||
import jadx.core.dex.instructions.args.InsnArg;
|
||||
@@ -85,6 +86,13 @@ public class PostTypeResolver {
|
||||
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:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -9,12 +9,18 @@ import jadx.core.dex.nodes.MethodNode;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.containsString;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertThat;
|
||||
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 static class TestCls {
|
||||
@@ -23,7 +29,7 @@ public class TestDuplicateCast extends InternalJadxTest {
|
||||
}
|
||||
}
|
||||
|
||||
//@Test
|
||||
@Test
|
||||
public void test() {
|
||||
ClassNode cls = getClassNode(TestCls.class);
|
||||
MethodNode mth = getMethod(cls, "method");
|
||||
|
||||
Reference in New Issue
Block a user