Commit 210c8e54 authored by Skylot's avatar Skylot

Adjust types merge, other code improvements

parent 4e284c4c
...@@ -124,9 +124,7 @@ public class RegionGen extends InsnGen { ...@@ -124,9 +124,7 @@ public class RegionGen extends InsnGen {
} }
code.add('{'); code.add('{');
code.incIndent(); makeRegionIndent(code, els);
makeRegion(code, els);
code.decIndent();
code.startLine('}'); code.startLine('}');
} }
} }
......
...@@ -187,18 +187,12 @@ public abstract class ArgType { ...@@ -187,18 +187,12 @@ public abstract class ArgType {
@Override @Override
public int getArrayDimension() { public int getArrayDimension() {
if (isArray()) return 1 + arrayElement.getArrayDimension();
return 1 + arrayElement.getArrayDimension();
else
return 0;
} }
@Override @Override
public ArgType getArrayRootElement() { public ArgType getArrayRootElement() {
if (isArray()) return arrayElement.getArrayRootElement();
return arrayElement.getArrayRootElement();
else
return this;
} }
@Override @Override
...@@ -235,7 +229,6 @@ public abstract class ArgType { ...@@ -235,7 +229,6 @@ public abstract class ArgType {
@Override @Override
public ArgType selectFirst() { public ArgType selectFirst() {
assert possibleTypes != null;
PrimitiveType f = possibleTypes[0]; PrimitiveType f = possibleTypes[0];
if (f == PrimitiveType.OBJECT || f == PrimitiveType.ARRAY) if (f == PrimitiveType.OBJECT || f == PrimitiveType.ARRAY)
return object(Consts.CLASS_OBJECT); return object(Consts.CLASS_OBJECT);
...@@ -280,10 +273,6 @@ public abstract class ArgType { ...@@ -280,10 +273,6 @@ public abstract class ArgType {
return null; return null;
} }
public ArgType getArrayElement() {
return null;
}
public boolean isArray() { public boolean isArray() {
return false; return false;
} }
...@@ -292,6 +281,10 @@ public abstract class ArgType { ...@@ -292,6 +281,10 @@ public abstract class ArgType {
return 0; return 0;
} }
public ArgType getArrayElement() {
return null;
}
public ArgType getArrayRootElement() { public ArgType getArrayRootElement() {
return this; return this;
} }
...@@ -363,8 +356,7 @@ public abstract class ArgType { ...@@ -363,8 +356,7 @@ public abstract class ArgType {
return a; return a;
else else
// different objects // different objects
return OBJECT; return null;
// return null;
} }
if (a.isArray() && b.isArray()) { if (a.isArray() && b.isArray()) {
...@@ -526,7 +518,6 @@ public abstract class ArgType { ...@@ -526,7 +518,6 @@ public abstract class ArgType {
if (prev != null) { if (prev != null) {
genericMap.put(prev, genList); genericMap.put(prev, genList);
} }
// LOG.debug("sign: {} -> {}", gen, genericMap);
} }
return genericMap; return genericMap;
} catch (Throwable e) { } catch (Throwable e) {
...@@ -570,7 +561,7 @@ public abstract class ArgType { ...@@ -570,7 +561,7 @@ public abstract class ArgType {
@Override @Override
public String toString() { public String toString() {
return "UNKNOWN"; return "ARG_TYPE";
} }
@Override @Override
...@@ -583,11 +574,8 @@ public abstract class ArgType { ...@@ -583,11 +574,8 @@ public abstract class ArgType {
if (this == obj) return true; if (this == obj) return true;
if (obj == null) return false; if (obj == null) return false;
if (hash != obj.hashCode()) return false; if (hash != obj.hashCode()) return false;
if (getClass() != obj.getClass()) { if (getClass() != obj.getClass()) return false;
return false;
}
// TODO: don't use toString // TODO: don't use toString
return toString().equals(obj.toString()); return toString().equals(obj.toString());
} }
} }
...@@ -48,7 +48,6 @@ public class BlockProcessingHelper { ...@@ -48,7 +48,6 @@ public class BlockProcessingHelper {
excArg.getTypedVar().forceSetType(ArgType.THROWABLE); excArg.getTypedVar().forceSetType(ArgType.THROWABLE);
else else
excArg.getTypedVar().forceSetType(excHandler.getCatchType().getType()); excArg.getTypedVar().forceSetType(excHandler.getCatchType().getType());
// excArg.getTypedVar().merge(excHandler.getCatchType().getType());
excHandler.setArg(excArg); excHandler.setArg(excArg);
block.getAttributes().add(handlerAttr); block.getAttributes().add(handlerAttr);
......
...@@ -193,7 +193,12 @@ public class ModVisitor extends AbstractVisitor { ...@@ -193,7 +193,12 @@ public class ModVisitor extends AbstractVisitor {
// move not removed instructions to 'finally' block // move not removed instructions to 'finally' block
if (size != 0) { if (size != 0) {
// TODO: support instructions from several blocks // 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(); size = insns.size();
} }
} }
......
...@@ -3,7 +3,6 @@ package jadx.dex.visitors.regions; ...@@ -3,7 +3,6 @@ package jadx.dex.visitors.regions;
import jadx.dex.attributes.AttributeFlag; import jadx.dex.attributes.AttributeFlag;
import jadx.dex.attributes.AttributeType; import jadx.dex.attributes.AttributeType;
import jadx.dex.attributes.AttributesList; import jadx.dex.attributes.AttributesList;
import jadx.dex.attributes.ForceReturnAttr;
import jadx.dex.attributes.IAttribute; import jadx.dex.attributes.IAttribute;
import jadx.dex.attributes.LoopAttr; import jadx.dex.attributes.LoopAttr;
import jadx.dex.instructions.IfNode; import jadx.dex.instructions.IfNode;
...@@ -210,17 +209,20 @@ public class RegionMaker { ...@@ -210,17 +209,20 @@ public class RegionMaker {
if (BlockUtils.isPathExists(loopExit, next)) { if (BlockUtils.isPathExists(loopExit, next)) {
// found cross // found cross
if (next.getCleanSuccessors().size() == 1) { if (next.getCleanSuccessors().size() == 1) {
// TODO: do nothing until return is splitted
BlockNode r = BlockUtils.getNextBlock(next); BlockNode r = BlockUtils.getNextBlock(next);
if (r != null if (r != null
&& r.getAttributes().contains(AttributeFlag.RETURN) && r.getAttributes().contains(AttributeFlag.RETURN)
&& r.getInstructions().size() > 0 && r.getInstructions().size() > 0
&& r.getInstructions().get(0).getType() == InsnType.RETURN) { && 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 { } else {
next.getAttributes().add(AttributeFlag.BREAK); // next.getAttributes().add(AttributeFlag.BREAK);
// stack.addExit(r);
} }
} else {
stack.addExit(next);
} }
stack.addExit(next);
break; break;
} }
next = BlockUtils.getNextBlock(next); next = BlockUtils.getNextBlock(next);
......
...@@ -100,8 +100,7 @@ public class RegionUtils { ...@@ -100,8 +100,7 @@ public class RegionUtils {
} }
/** /**
* Check if region contains in container * Check if {@code region} contains in {@code container}.<br>
*
* For simple region (not from exception handlers) search in parents * For simple region (not from exception handlers) search in parents
* otherwise run recursive search because exception handlers can have several parents * otherwise run recursive search because exception handlers can have several parents
*/ */
......
...@@ -39,12 +39,8 @@ public class TypeMergeTest extends TestCase { ...@@ -39,12 +39,8 @@ public class TypeMergeTest extends TestCase {
unknown(PrimitiveType.OBJECT)); unknown(PrimitiveType.OBJECT));
first(object("Lsomeobj;"), object("Lsomeobj;")); 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);
// first(object("Lsomeobj;"), object("Lsomeobj;"));
// merge(object("Lsomeobj;"), object("Lotherobj;"), null);
// merge(object("Lsomeobj;"), OBJECT, null);
} }
private void first(ArgType t1, ArgType t2) { private void first(ArgType t1, ArgType t2) {
......
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