From 210c8e547cb16abc64b1db0333a3f1b0a8240714 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 4 May 2013 18:19:34 +0400 Subject: [PATCH] Adjust types merge, other code improvements --- src/main/java/jadx/codegen/RegionGen.java | 4 +-- .../jadx/dex/instructions/args/ArgType.java | 34 ++++++------------- .../dex/visitors/BlockProcessingHelper.java | 1 - .../java/jadx/dex/visitors/ModVisitor.java | 7 +++- .../dex/visitors/regions/RegionMaker.java | 10 +++--- src/main/java/jadx/utils/RegionUtils.java | 3 +- src/test/java/jadx/tests/TypeMergeTest.java | 6 +--- 7 files changed, 26 insertions(+), 39 deletions(-) diff --git a/src/main/java/jadx/codegen/RegionGen.java b/src/main/java/jadx/codegen/RegionGen.java index 5d243d717..02bd738ce 100644 --- a/src/main/java/jadx/codegen/RegionGen.java +++ b/src/main/java/jadx/codegen/RegionGen.java @@ -124,9 +124,7 @@ public class RegionGen extends InsnGen { } code.add('{'); - code.incIndent(); - makeRegion(code, els); - code.decIndent(); + makeRegionIndent(code, els); code.startLine('}'); } } diff --git a/src/main/java/jadx/dex/instructions/args/ArgType.java b/src/main/java/jadx/dex/instructions/args/ArgType.java index 69093e595..ab3838d63 100644 --- a/src/main/java/jadx/dex/instructions/args/ArgType.java +++ b/src/main/java/jadx/dex/instructions/args/ArgType.java @@ -187,18 +187,12 @@ public abstract class ArgType { @Override public int getArrayDimension() { - if (isArray()) - return 1 + arrayElement.getArrayDimension(); - else - return 0; + return 1 + arrayElement.getArrayDimension(); } @Override public ArgType getArrayRootElement() { - if (isArray()) - return arrayElement.getArrayRootElement(); - else - return this; + return arrayElement.getArrayRootElement(); } @Override @@ -235,7 +229,6 @@ public abstract class ArgType { @Override public ArgType selectFirst() { - assert possibleTypes != null; PrimitiveType f = possibleTypes[0]; if (f == PrimitiveType.OBJECT || f == PrimitiveType.ARRAY) return object(Consts.CLASS_OBJECT); @@ -280,10 +273,6 @@ public abstract class ArgType { return null; } - public ArgType getArrayElement() { - return null; - } - public boolean isArray() { return false; } @@ -292,6 +281,10 @@ public abstract class ArgType { return 0; } + public ArgType getArrayElement() { + return null; + } + public ArgType getArrayRootElement() { return this; } @@ -363,8 +356,7 @@ public abstract class ArgType { return a; else // different objects - return OBJECT; - // return null; + return null; } if (a.isArray() && b.isArray()) { @@ -526,7 +518,6 @@ public abstract class ArgType { if (prev != null) { genericMap.put(prev, genList); } - // LOG.debug("sign: {} -> {}", gen, genericMap); } return genericMap; } catch (Throwable e) { @@ -570,7 +561,7 @@ public abstract class ArgType { @Override public String toString() { - return "UNKNOWN"; + return "ARG_TYPE"; } @Override @@ -583,11 +574,8 @@ public abstract class ArgType { if (this == obj) return true; if (obj == null) return false; if (hash != obj.hashCode()) return false; - if (getClass() != obj.getClass()) { - return false; - } + if (getClass() != obj.getClass()) return false; // TODO: don't use toString - return toString().equals(obj.toString()); - } - + return toString().equals(obj.toString()); + } } diff --git a/src/main/java/jadx/dex/visitors/BlockProcessingHelper.java b/src/main/java/jadx/dex/visitors/BlockProcessingHelper.java index 3079710bc..70cecab86 100644 --- a/src/main/java/jadx/dex/visitors/BlockProcessingHelper.java +++ b/src/main/java/jadx/dex/visitors/BlockProcessingHelper.java @@ -48,7 +48,6 @@ public class BlockProcessingHelper { excArg.getTypedVar().forceSetType(ArgType.THROWABLE); else excArg.getTypedVar().forceSetType(excHandler.getCatchType().getType()); - // excArg.getTypedVar().merge(excHandler.getCatchType().getType()); excHandler.setArg(excArg); block.getAttributes().add(handlerAttr); diff --git a/src/main/java/jadx/dex/visitors/ModVisitor.java b/src/main/java/jadx/dex/visitors/ModVisitor.java index 3f7f92c7f..24560ceba 100644 --- a/src/main/java/jadx/dex/visitors/ModVisitor.java +++ b/src/main/java/jadx/dex/visitors/ModVisitor.java @@ -193,7 +193,12 @@ public class ModVisitor extends AbstractVisitor { // move not removed instructions to 'finally' block if (size != 0) { // TODO: support instructions from several blocks - tryBlock.setFinalBlockFromInsns(mth, insns); + // tryBlock.setFinalBlockFromInsns(mth, insns); + + // TODO; because of incomplete realization don't extract final block, + // just remove unnecessary instructions + insns.clear(); + size = insns.size(); } } diff --git a/src/main/java/jadx/dex/visitors/regions/RegionMaker.java b/src/main/java/jadx/dex/visitors/regions/RegionMaker.java index 7dc9146e6..1b2c6b2dd 100644 --- a/src/main/java/jadx/dex/visitors/regions/RegionMaker.java +++ b/src/main/java/jadx/dex/visitors/regions/RegionMaker.java @@ -3,7 +3,6 @@ package jadx.dex.visitors.regions; import jadx.dex.attributes.AttributeFlag; import jadx.dex.attributes.AttributeType; import jadx.dex.attributes.AttributesList; -import jadx.dex.attributes.ForceReturnAttr; import jadx.dex.attributes.IAttribute; import jadx.dex.attributes.LoopAttr; import jadx.dex.instructions.IfNode; @@ -210,17 +209,20 @@ public class RegionMaker { if (BlockUtils.isPathExists(loopExit, next)) { // found cross if (next.getCleanSuccessors().size() == 1) { + // TODO: do nothing until return is splitted BlockNode r = BlockUtils.getNextBlock(next); if (r != null && r.getAttributes().contains(AttributeFlag.RETURN) && r.getInstructions().size() > 0 && r.getInstructions().get(0).getType() == InsnType.RETURN) { - next.getAttributes().add(new ForceReturnAttr(r.getInstructions().get(0))); + // next.getAttributes().add(new ForceReturnAttr(r.getInstructions().get(0))); } else { - next.getAttributes().add(AttributeFlag.BREAK); + // next.getAttributes().add(AttributeFlag.BREAK); + // stack.addExit(r); } + } else { + stack.addExit(next); } - stack.addExit(next); break; } next = BlockUtils.getNextBlock(next); diff --git a/src/main/java/jadx/utils/RegionUtils.java b/src/main/java/jadx/utils/RegionUtils.java index 93eafe2a0..39d6a266e 100644 --- a/src/main/java/jadx/utils/RegionUtils.java +++ b/src/main/java/jadx/utils/RegionUtils.java @@ -100,8 +100,7 @@ public class RegionUtils { } /** - * Check if region contains in container - * + * Check if {@code region} contains in {@code container}.
* For simple region (not from exception handlers) search in parents * otherwise run recursive search because exception handlers can have several parents */ diff --git a/src/test/java/jadx/tests/TypeMergeTest.java b/src/test/java/jadx/tests/TypeMergeTest.java index d91b3e3b1..346f0a610 100644 --- a/src/test/java/jadx/tests/TypeMergeTest.java +++ b/src/test/java/jadx/tests/TypeMergeTest.java @@ -39,12 +39,8 @@ public class TypeMergeTest extends TestCase { unknown(PrimitiveType.OBJECT)); first(object("Lsomeobj;"), object("Lsomeobj;")); - merge(object("Lsomeobj;"), object("Lotherobj;"), OBJECT); + merge(object("Lsomeobj;"), object("Lotherobj;"), null); first(object("Lsomeobj;"), OBJECT); - - // first(object("Lsomeobj;"), object("Lsomeobj;")); - // merge(object("Lsomeobj;"), object("Lotherobj;"), null); - // merge(object("Lsomeobj;"), OBJECT, null); } private void first(ArgType t1, ArgType t2) {