From df1152516ad9bc74b273195df9638783c039a3f4 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 10 Jan 2015 21:23:34 +0300 Subject: [PATCH] core: print original value near replaced with field value in switch --- .../src/main/java/jadx/core/codegen/RegionGen.java | 14 +++++++++----- .../java/jadx/core/dex/visitors/ModVisitor.java | 2 +- .../integration/switches/TestSwitchLabels.java | 4 ++-- .../switches/TestSwitchWithFallThroughCase.java | 1 + .../switches/TestSwitchWithFallThroughCase2.java | 2 +- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/codegen/RegionGen.java b/jadx-core/src/main/java/jadx/core/codegen/RegionGen.java index f968c743..b2cf85fe 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/RegionGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/RegionGen.java @@ -5,8 +5,6 @@ import jadx.core.dex.attributes.AType; import jadx.core.dex.attributes.nodes.DeclareVariablesAttr; import jadx.core.dex.attributes.nodes.ForceReturnAttr; import jadx.core.dex.attributes.nodes.LoopLabelAttr; -import jadx.core.dex.info.FieldInfo; -import jadx.core.dex.instructions.IndexInsnNode; import jadx.core.dex.instructions.SwitchNode; import jadx.core.dex.instructions.args.InsnArg; import jadx.core.dex.instructions.args.NamedArg; @@ -17,6 +15,7 @@ import jadx.core.dex.nodes.IBlock; import jadx.core.dex.nodes.IContainer; import jadx.core.dex.nodes.IRegion; import jadx.core.dex.nodes.InsnNode; +import jadx.core.dex.nodes.parser.FieldValueAttr; import jadx.core.dex.regions.Region; import jadx.core.dex.regions.SwitchRegion; import jadx.core.dex.regions.SynchronizedRegion; @@ -249,11 +248,16 @@ public class RegionGen extends InsnGen { code.add(fn.getName()); } else { staticField(code, fn.getFieldInfo()); + // print original value, sometimes replace with incorrect field + FieldValueAttr valueAttr = fn.get(AType.FIELD_VALUE); + if (valueAttr != null && valueAttr.getValue() != null) { + code.add(" /*").add(valueAttr.getValue().toString()).add("*/"); + } } - } else if (k instanceof IndexInsnNode) { - staticField(code, (FieldInfo) ((IndexInsnNode) k).getIndex()); - } else { + } else if (k instanceof Integer) { code.add(TypeGen.literalToString((Integer) k, arg.getType())); + } else { + throw new JadxRuntimeException("Unexpected key in switch: " + (k != null ? k.getClass() : k)); } code.add(':'); } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java index 66b17aac..b2e4d6f7 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java @@ -90,7 +90,7 @@ public class ModVisitor extends AbstractVisitor { for (int k = 0; k < sn.getCasesCount(); k++) { FieldNode f = parentClass.getConstField(sn.getKeys()[k]); if (f != null) { - sn.getKeys()[k] = new IndexInsnNode(InsnType.SGET, f.getFieldInfo(), 0); + sn.getKeys()[k] = f; } } break; diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchLabels.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchLabels.java index 1c02333d..6ff6f48e 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchLabels.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchLabels.java @@ -38,11 +38,11 @@ public class TestSwitchLabels extends IntegrationTest { public void test() { ClassNode cls = getClassNode(TestCls.class); String code = cls.getCode().toString(); - assertThat(code, containsString("case CONST_ABC:")); + assertThat(code, containsString("case CONST_ABC")); assertThat(code, containsString("return CONST_CDE;")); cls.addInnerClass(getClassNode(TestCls.Inner.class)); - assertThat(code, containsString("case CONST_CDE_PRIVATE:")); + assertThat(code, containsString("case CONST_CDE_PRIVATE")); assertThat(code, containsString(".CONST_ABC;")); } } diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase.java index 2d1178f5..ccee95e0 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase.java @@ -11,6 +11,7 @@ import static org.junit.Assert.assertThat; public class TestSwitchWithFallThroughCase extends IntegrationTest { + @SuppressWarnings("fallthrough") public static class TestCls { public String test(int a, boolean b, boolean c) { String str = ""; diff --git a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase2.java b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase2.java index 05f81710..ed7bc6ea 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase2.java +++ b/jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchWithFallThroughCase2.java @@ -11,6 +11,7 @@ import static org.junit.Assert.assertThat; public class TestSwitchWithFallThroughCase2 extends IntegrationTest { + @SuppressWarnings("fallthrough") public static class TestCls { public String test(int a, boolean b, boolean c) { String str = ""; @@ -56,7 +57,6 @@ public class TestSwitchWithFallThroughCase2 extends IntegrationTest { @Test public void test() { - setOutputCFG(); ClassNode cls = getClassNode(TestCls.class); String code = cls.getCode().toString(); -- GitLab