From 4ace552a2759e662348a7656ef55f9eacc35b87c Mon Sep 17 00:00:00 2001 From: Skylot Date: Sun, 23 Feb 2014 01:19:46 +0400 Subject: [PATCH] core: fix duplicate cast --- .../visitors/typeresolver/TypeResolver.java | 19 ------------------- .../typeresolver/finish/PostTypeResolver.java | 8 ++++++++ .../tests/internal/TestDuplicateCast.java | 8 +++++++- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeresolver/TypeResolver.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeresolver/TypeResolver.java index 5460158dd..8916b3c04 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeresolver/TypeResolver.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeresolver/TypeResolver.java @@ -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); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/typeresolver/finish/PostTypeResolver.java b/jadx-core/src/main/java/jadx/core/dex/visitors/typeresolver/finish/PostTypeResolver.java index 324a25516..b6847220c 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/typeresolver/finish/PostTypeResolver.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/typeresolver/finish/PostTypeResolver.java @@ -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; } diff --git a/jadx-core/src/test/java/jadx/tests/internal/TestDuplicateCast.java b/jadx-core/src/test/java/jadx/tests/internal/TestDuplicateCast.java index 53ef715c8..2e5a45eb0 100644 --- a/jadx-core/src/test/java/jadx/tests/internal/TestDuplicateCast.java +++ b/jadx-core/src/test/java/jadx/tests/internal/TestDuplicateCast.java @@ -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");