From 6bac5c162e2e91c1ec2b72bf6f2587f204b20f83 Mon Sep 17 00:00:00 2001 From: Skylot Date: Wed, 25 Dec 2013 23:55:02 +0400 Subject: [PATCH] core: select correct array type element --- .../main/java/jadx/core/codegen/InsnGen.java | 6 ++- .../java/jadx/tests/internal/TestTmp2.java | 39 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 jadx-core/src/test/java/jadx/tests/internal/TestTmp2.java diff --git a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java index 263b5fa9b6e..5fcec3d13ff 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -472,7 +472,11 @@ private void fillArray(FillArrayNode insn, CodeWriter code) throws CodegenExcept ArgType elType = insn.getElementType(); if (!elType.equals(insnElementType) && !insnArrayType.equals(ArgType.OBJECT)) { ErrorsCounter.methodError(mth, - "Incorrect type for fill-array insn " + InsnUtils.formatOffset(insn.getOffset())); + "Incorrect type for fill-array insn " + InsnUtils.formatOffset(insn.getOffset()) + + ", element type: " + elType + ", insn element type: " + insnElementType); + if (!elType.isTypeKnown()) { + elType = insnElementType.isTypeKnown() ? insnElementType : elType.selectFirst(); + } } StringBuilder str = new StringBuilder(); Object data = insn.getData(); diff --git a/jadx-core/src/test/java/jadx/tests/internal/TestTmp2.java b/jadx-core/src/test/java/jadx/tests/internal/TestTmp2.java new file mode 100644 index 00000000000..2d4ed1189bd --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/internal/TestTmp2.java @@ -0,0 +1,39 @@ +package jadx.tests.internal; + +import jadx.api.InternalJadxTest; +import jadx.core.dex.nodes.ClassNode; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; + +public class TestTmp2 extends InternalJadxTest { + + public static class TestCls extends Exception { + int c; + String d; + String f; + + public void testComplexIf(String a, int b) { + if (d == null || (c == 0 && b != -1 && d.length() == 0)) { + c = a.codePointAt(c); + } else { + if (a.hashCode() != 0xCDE) { + c = f.compareTo(a); + } + } + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + System.out.println(code); + + assertThat(code, containsString("return;")); + assertThat(code, not(containsString("else"))); + } +}