提交 210c8e54 编写于 作者: S Skylot

Adjust types merge, other code improvements

上级 4e284c4c
......@@ -124,9 +124,7 @@ public class RegionGen extends InsnGen {
}
code.add('{');
code.incIndent();
makeRegion(code, els);
code.decIndent();
makeRegionIndent(code, els);
code.startLine('}');
}
}
......
......@@ -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());
}
}
......@@ -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);
......
......@@ -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();
}
}
......
......@@ -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);
......
......@@ -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
* otherwise run recursive search because exception handlers can have several parents
*/
......
......@@ -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) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册