Commit 0d509f94 authored by Skylot's avatar Skylot

core: fix various processing issues

parent e4fbbcf2
...@@ -5,6 +5,7 @@ import jadx.core.dex.attributes.AType; ...@@ -5,6 +5,7 @@ import jadx.core.dex.attributes.AType;
import jadx.core.dex.attributes.AttrNode; import jadx.core.dex.attributes.AttrNode;
import jadx.core.dex.attributes.nodes.IgnoreEdgeAttr; import jadx.core.dex.attributes.nodes.IgnoreEdgeAttr;
import jadx.core.dex.attributes.nodes.LoopInfo; import jadx.core.dex.attributes.nodes.LoopInfo;
import jadx.core.utils.EmptyBitSet;
import jadx.core.utils.InsnUtils; import jadx.core.utils.InsnUtils;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -24,7 +25,7 @@ public class BlockNode extends AttrNode implements IBlock { ...@@ -24,7 +25,7 @@ public class BlockNode extends AttrNode implements IBlock {
private List<BlockNode> cleanSuccessors; private List<BlockNode> cleanSuccessors;
// all dominators // all dominators
private BitSet doms; private BitSet doms = EmptyBitSet.EMPTY;
// dominance frontier // dominance frontier
private BitSet domFrontier; private BitSet domFrontier;
// immediate dominator // immediate dominator
......
...@@ -126,9 +126,11 @@ public class MethodNode extends LineAttrNode implements ILoadable { ...@@ -126,9 +126,11 @@ public class MethodNode extends LineAttrNode implements ILoadable {
list.add(resultArg); list.add(resultArg);
} }
insnNode.getRegisterArgs(list); insnNode.getRegisterArgs(list);
for (int i = 0, listSize = list.size(); i < listSize; i++) { int argsCount = list.size();
for (int i = 0; i < argsCount; i++) {
if (list.get(i).getRegNum() >= regsCount) { if (list.get(i).getRegNum() >= regsCount) {
throw new JadxRuntimeException("Incorrect register number in instruction: " + insnNode); throw new JadxRuntimeException("Incorrect register number in instruction: " + insnNode
+ ", expected to be less than " + regsCount);
} }
} }
} }
......
...@@ -106,13 +106,17 @@ public class ConstInlineVisitor extends AbstractVisitor { ...@@ -106,13 +106,17 @@ public class ConstInlineVisitor extends AbstractVisitor {
continue; continue;
} }
LiteralArg litArg; LiteralArg litArg;
ArgType argType = arg.getType();
if (argType.isObject() && literal != 0) {
argType = ArgType.NARROW_NUMBERS;
}
if (use.size() == 1 || arg.isTypeImmutable()) { if (use.size() == 1 || arg.isTypeImmutable()) {
// arg used only in one place // arg used only in one place
litArg = InsnArg.lit(literal, arg.getType()); litArg = InsnArg.lit(literal, argType);
} else if (useInsn.getType() == InsnType.MOVE } else if (useInsn.getType() == InsnType.MOVE
&& !useInsn.getResult().getType().isTypeKnown()) { && !useInsn.getResult().getType().isTypeKnown()) {
// save type for 'move' instructions (hard to find type in chains of 'move') // save type for 'move' instructions (hard to find type in chains of 'move')
litArg = InsnArg.lit(literal, arg.getType()); litArg = InsnArg.lit(literal, argType);
} else { } else {
// in most cases type not equal arg.getType() // in most cases type not equal arg.getType()
// just set unknown type and run type fixer // just set unknown type and run type fixer
......
...@@ -912,7 +912,11 @@ public class RegionMaker { ...@@ -912,7 +912,11 @@ public class RegionMaker {
handler.setHandlerRegion(makeRegion(start, stack)); handler.setHandlerRegion(makeRegion(start, stack));
ExcHandlerAttr excHandlerAttr = start.get(AType.EXC_HANDLER); ExcHandlerAttr excHandlerAttr = start.get(AType.EXC_HANDLER);
handler.getHandlerRegion().addAttr(excHandlerAttr); if (excHandlerAttr == null) {
LOG.warn("Missing exception handler attribute for start block");
} else {
handler.getHandlerRegion().addAttr(excHandlerAttr);
}
} }
static boolean isEqualPaths(BlockNode b1, BlockNode b2) { static boolean isEqualPaths(BlockNode b1, BlockNode b2) {
......
...@@ -88,8 +88,10 @@ public class PostTypeInference { ...@@ -88,8 +88,10 @@ public class PostTypeInference {
case CHECK_CAST: { case CHECK_CAST: {
ArgType castType = (ArgType) ((IndexInsnNode) insn).getIndex(); ArgType castType = (ArgType) ((IndexInsnNode) insn).getIndex();
RegisterArg result = insn.getResult(); RegisterArg result = insn.getResult();
ArgType resultType = result.getType();
// don't override generic types of same base class // don't override generic types of same base class
boolean skip = castType.isObject() && castType.getObject().equals(result.getType().getObject()); boolean skip = castType.isObject() && resultType.isObject()
&& castType.getObject().equals(resultType.getObject());
if (!skip) { if (!skip) {
// workaround for compiler bug (see TestDuplicateCast) // workaround for compiler bug (see TestDuplicateCast)
result.getSVar().setType(castType); result.getSVar().setType(castType);
......
...@@ -18,7 +18,7 @@ public class JadxSettings extends JadxCLIArgs { ...@@ -18,7 +18,7 @@ public class JadxSettings extends JadxCLIArgs {
private static final Font DEFAULT_FONT = new JLabel().getFont(); private static final Font DEFAULT_FONT = new JLabel().getFont();
static final Set<String> SKIP_FIELDS = new HashSet<String>(Arrays.asList( static final Set<String> SKIP_FIELDS = new HashSet<String>(Arrays.asList(
"files", "input", "outputDir", "printHelp" "files", "input", "outputDir", "verbose", "printHelp"
)); ));
private String lastOpenFilePath = USER_HOME; private String lastOpenFilePath = USER_HOME;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment