From e5b84d942e84c05062dc74eb0f4135d3429b7ec8 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sun, 15 Feb 2015 17:34:48 +0300 Subject: [PATCH] core: fix types for constant replace --- .../src/main/java/jadx/core/dex/nodes/ClassNode.java | 10 ++++++++-- .../jadx/core/dex/visitors/ConstInlinerVisitor.java | 11 ++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java index 13f97a39..04d9447c 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java @@ -279,10 +279,16 @@ public class ClassNode extends LineAttrNode implements ILoadable { if (field == null && searchGlobal) { field = dex.getConstFields().get(obj); } - if (field == null && obj instanceof Integer) { + if (obj instanceof Integer) { String str = dex.root().getResourcesNames().get(obj); if (str != null) { - return new ResRefField(dex, str.replace('/', '.')); + ResRefField resField = new ResRefField(dex, str.replace('/', '.')); + if (field == null) { + return resField; + } + if (!field.getName().equals(resField.getName())) { + field = resField; + } } } return field; diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java index 6d46fe3c..871d4219 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ConstInlinerVisitor.java @@ -9,12 +9,14 @@ import jadx.core.dex.instructions.InvokeType; import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.instructions.args.InsnArg; import jadx.core.dex.instructions.args.LiteralArg; +import jadx.core.dex.instructions.args.PrimitiveType; import jadx.core.dex.instructions.args.RegisterArg; import jadx.core.dex.instructions.args.SSAVar; import jadx.core.dex.nodes.BlockNode; import jadx.core.dex.nodes.FieldNode; import jadx.core.dex.nodes.InsnNode; import jadx.core.dex.nodes.MethodNode; +import jadx.core.dex.visitors.typeinference.PostTypeInference; import jadx.core.utils.InstructionRemover; import jadx.core.utils.exceptions.JadxException; @@ -124,7 +126,13 @@ public class ConstInlinerVisitor extends AbstractVisitor { fixTypes(mth, useInsn, litArg); replaceCount++; - FieldNode f = mth.getParentClass().getConstFieldByLiteralArg(litArg); + FieldNode f = null; + ArgType litArgType = litArg.getType(); + if (litArgType.isTypeKnown()) { + f = mth.getParentClass().getConstFieldByLiteralArg(litArg); + } else if (litArgType.contains(PrimitiveType.INT)) { + f = mth.getParentClass().getConstField((int) literal, false); + } if (f != null) { litArg.wrapInstruction(new IndexInsnNode(InsnType.SGET, f.getFieldInfo(), 0)); } @@ -138,6 +146,7 @@ public class ConstInlinerVisitor extends AbstractVisitor { * but contains some expensive operations needed only after constant inline */ private static void fixTypes(MethodNode mth, InsnNode insn, LiteralArg litArg) { + PostTypeInference.process(mth, insn); switch (insn.getType()) { case CONST: insn.getArg(0).merge(insn.getResult()); -- GitLab