Adjust types merge, other code improvements
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user