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 fcfa30c9b..26fd4a579 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -402,7 +402,7 @@ public class InsnGen { /* fallback mode instructions */ case IF: - assert isFallback(); + assert isFallback() : "if insn in not fallback mode"; IfNode ifInsn = (IfNode) insn; String cond = arg(insn.getArg(0)) + " " + ifInsn.getOp().getSymbol() + " " + (ifInsn.isZeroCmp() ? "0" : arg(insn.getArg(1))); 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 9ee9a729b..ff89d89a4 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 @@ -13,6 +13,7 @@ import jadx.core.dex.info.FieldInfo; import jadx.core.dex.info.MethodInfo; import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.instructions.args.LiteralArg; +import jadx.core.dex.instructions.args.PrimitiveType; import jadx.core.dex.nodes.parser.AnnotationsParser; import jadx.core.dex.nodes.parser.FieldValueAttr; import jadx.core.dex.nodes.parser.StaticValuesParser; @@ -140,10 +141,10 @@ public class ClassNode extends LineAttrNode implements ILoadable { if (accFlags.isStatic() && accFlags.isFinal()) { FieldValueAttr fv = (FieldValueAttr) f.getAttributes().get(AttributeType.FIELD_VALUE); if (fv != null && fv.getValue() != null) { - if (accFlags.isPublic()) + if (accFlags.isPublic()) { dex.getConstFields().put(fv.getValue(), f); - else - constFields.put(fv.getValue(), f); + } + constFields.put(fv.getValue(), f); } } } @@ -237,34 +238,49 @@ public class ClassNode extends LineAttrNode implements ILoadable { return fields; } - public FieldNode getConstField(Object o) { + public FieldNode getConstField(Object obj) { + return getConstField(obj, true); + } + + public FieldNode getConstField(Object obj, boolean searchGlobal) { ClassNode cn = this; FieldNode field; do { - field = cn.constFields.get(o); + field = cn.constFields.get(obj); } while (field == null - && (cn.clsInfo.getParentClass() != null) - && (cn = dex.resolveClass(cn.clsInfo.getParentClass())) != null); + && (cn.clsInfo.getParentClass() != null) + && (cn = dex.resolveClass(cn.clsInfo.getParentClass())) != null); - if (field == null) - field = dex.getConstFields().get(o); + if (field == null && searchGlobal) { + field = dex.getConstFields().get(obj); + } return field; } public FieldNode getConstFieldByLiteralArg(LiteralArg arg) { - ArgType type = arg.getType(); + PrimitiveType type = arg.getType().getPrimitiveType(); + if (type == null) { + return null; + } long literal = arg.getLiteral(); - - if (type.equals(ArgType.DOUBLE)) - return getConstField(Double.longBitsToDouble(literal)); - else if (type.equals(ArgType.FLOAT)) - return getConstField(Float.intBitsToFloat((int) literal)); - else if (Math.abs(literal) > 0x1) { - if (type.equals(ArgType.INT)) - return getConstField((int) literal); - else if (type.equals(ArgType.LONG)) - return getConstField(literal); + switch (type) { + case BOOLEAN: + return getConstField(literal == 1, false); + case CHAR: + return getConstField((char) literal, Math.abs(literal) > 1); + case BYTE: + return getConstField((byte) literal, Math.abs(literal) > 1); + case SHORT: + return getConstField((short) literal, Math.abs(literal) > 1); + case INT: + return getConstField((int) literal, Math.abs(literal) > 1); + case LONG: + return getConstField(literal, Math.abs(literal) > 1); + case FLOAT: + return getConstField(Float.intBitsToFloat((int) literal), true); + case DOUBLE: + return getConstField(Double.longBitsToDouble(literal), true); } return null; } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessVariables.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessVariables.java index ff85bc289..7f1c7f0b5 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessVariables.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/ProcessVariables.java @@ -13,9 +13,9 @@ import jadx.core.utils.RegionUtils; import jadx.core.utils.exceptions.JadxException; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -65,7 +65,7 @@ public class ProcessVariables extends AbstractVisitor { @Override public void visit(MethodNode mth) throws JadxException { - final Map usageMap = new HashMap(); + final Map usageMap = new LinkedHashMap(); // collect all variables usage IRegionVisitor collect = new TracedRegionVisitor() {