提交 7f4da306 编写于 作者: S Skylot

refactor: remove cloning library dependency

上级 424a8ffa
......@@ -7,7 +7,6 @@ dependencies {
compile 'org.ow2.asm:asm:7.1'
compile 'org.jetbrains:annotations:17.0.0'
compile 'uk.com.robust-it:cloning:1.9.12'
compile 'com.google.code.gson:gson:2.8.5'
compile 'org.smali:baksmali:2.2.7'
......
......@@ -71,6 +71,11 @@ public class ArithNode extends InsnNode {
return op == other.op;
}
@Override
public InsnNode copy() {
return copyCommonParams(new ArithNode(op, getResult(), getArg(0), getArg(1)));
}
@Override
public String toString() {
return InsnUtils.formatOffset(offset) + ": "
......
......@@ -25,13 +25,15 @@ public final class FillArrayNode extends InsnNode {
private ArgType elemType;
public FillArrayNode(int resReg, FillArrayDataPayloadDecodedInstruction payload) {
super(InsnType.FILL_ARRAY, 1);
ArgType elType = getElementType(payload.getElementWidthUnit());
addArg(InsnArg.reg(resReg, ArgType.array(elType)));
this(payload.getData(), payload.getSize(), getElementType(payload.getElementWidthUnit()));
addArg(InsnArg.reg(resReg, ArgType.array(elemType)));
}
this.data = payload.getData();
this.size = payload.getSize();
this.elemType = elType;
private FillArrayNode(Object data, int size, ArgType elemType) {
super(InsnType.FILL_ARRAY, 1);
this.data = data;
this.size = size;
this.elemType = elemType;
}
private static ArgType getElementType(short elementWidthUnit) {
......@@ -98,6 +100,11 @@ public final class FillArrayNode extends InsnNode {
return elemType.equals(other.elemType) && data == other.data;
}
@Override
public InsnNode copy() {
return copyCommonParams(new FillArrayNode(data, size, elemType));
}
public String dataToString() {
if (data instanceof int[]) {
return Arrays.toString((int[]) data);
......
......@@ -34,6 +34,11 @@ public class FilledNewArrayNode extends InsnNode {
return elemType == other.elemType;
}
@Override
public InsnNode copy() {
return copyCommonParams(new FilledNewArrayNode(elemType, getArgsCount()));
}
@Override
public String toString() {
return super.toString() + " elemType: " + elemType;
......
package jadx.core.dex.instructions;
import jadx.core.dex.nodes.InsnNode;
import jadx.core.utils.InsnUtils;
public class GotoNode extends TargetInsnNode {
......@@ -19,6 +20,11 @@ public class GotoNode extends TargetInsnNode {
return target;
}
@Override
public InsnNode copy() {
return copyCommonParams(new GotoNode(target));
}
@Override
public String toString() {
return super.toString() + "-> " + InsnUtils.formatOffset(target);
......
......@@ -34,12 +34,16 @@ public class IfNode extends GotoNode {
}
public IfNode(IfOp op, int targetOffset, InsnArg arg1, InsnArg arg2) {
super(InsnType.IF, targetOffset, 2);
this.op = op;
this(op, targetOffset);
addArg(arg1);
addArg(arg2);
}
private IfNode(IfOp op, int targetOffset) {
super(InsnType.IF, targetOffset, 2);
this.op = op;
}
// change default types priority
private static final ArgType WIDE_TYPE = ArgType.unknown(
PrimitiveType.INT, PrimitiveType.BOOLEAN,
......@@ -123,6 +127,14 @@ public class IfNode extends GotoNode {
return op == other.op;
}
@Override
public InsnNode copy() {
IfNode copy = new IfNode(op, target);
copy.thenBlock = thenBlock;
copy.elseBlock = elseBlock;
return copyCommonParams(copy);
}
@Override
public String toString() {
return InsnUtils.formatOffset(offset) + ": "
......
......@@ -12,12 +12,16 @@ public class NewArrayNode extends InsnNode {
private final ArgType arrType;
public NewArrayNode(@NotNull ArgType arrType, RegisterArg res, InsnArg size) {
super(InsnType.NEW_ARRAY, 1);
this.arrType = arrType;
this(arrType);
setResult(res);
addArg(size);
}
private NewArrayNode(ArgType arrType) {
super(InsnType.NEW_ARRAY, 1);
this.arrType = arrType;
}
public ArgType getArrayType() {
return arrType;
}
......@@ -34,6 +38,11 @@ public class NewArrayNode extends InsnNode {
return arrType == other.arrType;
}
@Override
public InsnNode copy() {
return copyCommonParams(new NewArrayNode(arrType));
}
@Override
public String toString() {
return super.toString() + " type: " + arrType;
......
......@@ -21,13 +21,17 @@ public final class PhiInsn extends InsnNode {
private final List<BlockNode> blockBinds;
public PhiInsn(int regNum, int predecessors) {
super(InsnType.PHI, predecessors);
this.blockBinds = new ArrayList<>(predecessors);
this(predecessors);
setResult(InsnArg.reg(regNum, ArgType.UNKNOWN));
add(AFlag.DONT_INLINE);
add(AFlag.DONT_GENERATE);
}
private PhiInsn(int argsCount) {
super(InsnType.PHI, argsCount);
this.blockBinds = new ArrayList<>(argsCount);
}
public RegisterArg bindArg(BlockNode pred) {
RegisterArg arg = InsnArg.reg(getResult().getRegNum(), getResult().getInitType());
bindArg(arg, pred);
......@@ -111,6 +115,11 @@ public final class PhiInsn extends InsnNode {
throw new JadxRuntimeException("Direct setArg is forbidden for PHI insn, bindArg must be used");
}
@Override
public InsnNode copy() {
return copyCommonParams(new PhiInsn(getArgsCount()));
}
@Override
public String toString() {
return "PHI: " + getResult() + " = " + Utils.listToString(getArguments())
......
......@@ -20,11 +20,15 @@ public class SwitchNode extends TargetInsnNode {
private BlockNode defTargetBlock;
public SwitchNode(InsnArg arg, Object[] keys, int[] targets, int def) {
this(keys, targets, def);
addArg(arg);
}
private SwitchNode(Object[] keys, int[] targets, int def) {
super(InsnType.SWITCH, 1);
this.keys = keys;
this.targets = targets;
this.def = def;
addArg(arg);
}
public int getCasesCount() {
......@@ -96,6 +100,14 @@ public class SwitchNode extends TargetInsnNode {
&& Arrays.equals(targets, other.targets);
}
@Override
public InsnNode copy() {
SwitchNode copy = new SwitchNode(keys, targets, def);
copy.targetBlocks = targetBlocks;
copy.defTargetBlock = defTargetBlock;
return copyCommonParams(copy);
}
@Override
public String toString() {
StringBuilder targ = new StringBuilder();
......
......@@ -104,6 +104,11 @@ public class ConstructorInsn extends InsnNode implements CallMthInterface {
&& callType == other.callType;
}
@Override
public InsnNode copy() {
return copyCommonParams(new ConstructorInsn(callMth, callType, instanceArg));
}
@Override
public String toString() {
return super.toString() + ' ' + callMth + ' ' + callType;
......
......@@ -16,7 +16,7 @@ public final class TernaryInsn extends InsnNode {
private IfCondition condition;
public TernaryInsn(IfCondition condition, RegisterArg result, InsnArg th, InsnArg els) {
super(InsnType.TERNARY, 2);
this();
setResult(result);
if (th.equals(LiteralArg.FALSE) && els.equals(LiteralArg.TRUE)) {
......@@ -31,6 +31,10 @@ public final class TernaryInsn extends InsnNode {
}
}
private TernaryInsn() {
super(InsnType.TERNARY, 2);
}
public IfCondition getCondition() {
return condition;
}
......@@ -67,6 +71,13 @@ public final class TernaryInsn extends InsnNode {
return condition.equals(that.condition);
}
@Override
public InsnNode copy() {
TernaryInsn copy = new TernaryInsn();
copy.condition = condition;
return copyCommonParams(copy);
}
@Override
public String toString() {
return InsnUtils.formatOffset(offset) + ": TERNARY"
......
......@@ -9,7 +9,6 @@ import java.util.Objects;
import org.jetbrains.annotations.Nullable;
import com.android.dx.io.instructions.DecodedInstruction;
import com.rits.cloning.Cloner;
import jadx.core.dex.attributes.AFlag;
import jadx.core.dex.attributes.nodes.LineAttrNode;
......@@ -17,23 +16,14 @@ import jadx.core.dex.instructions.InsnType;
import jadx.core.dex.instructions.args.ArgType;
import jadx.core.dex.instructions.args.InsnArg;
import jadx.core.dex.instructions.args.InsnWrapArg;
import jadx.core.dex.instructions.args.LiteralArg;
import jadx.core.dex.instructions.args.NamedArg;
import jadx.core.dex.instructions.args.RegisterArg;
import jadx.core.dex.instructions.args.SSAVar;
import jadx.core.utils.InsnRemover;
import jadx.core.utils.InsnUtils;
import jadx.core.utils.Utils;
import jadx.core.utils.exceptions.JadxRuntimeException;
public class InsnNode extends LineAttrNode {
private static final Cloner INSN_CLONER = new Cloner();
static {
INSN_CLONER.dontClone(ArgType.class, SSAVar.class, LiteralArg.class, NamedArg.class);
INSN_CLONER.dontCloneInstanceOf(RegisterArg.class);
}
protected final InsnType insnType;
private RegisterArg result;
......@@ -324,7 +314,7 @@ public class InsnNode extends LineAttrNode {
&& Objects.equals(arguments, other.arguments);
}
protected <T extends InsnNode> T copyCommonParams(T copy) {
protected final <T extends InsnNode> T copyCommonParams(T copy) {
copy.setResult(result);
if (copy.getArgsCount() == 0) {
for (InsnArg arg : this.getArguments()) {
......@@ -346,10 +336,10 @@ public class InsnNode extends LineAttrNode {
* Make copy of InsnNode object.
*/
public InsnNode copy() {
if (this.getClass() == InsnNode.class) {
return copyCommonParams(new InsnNode(insnType, getArgsCount()));
if (this.getClass() != InsnNode.class) {
throw new JadxRuntimeException("Copy method not implemented in insn class " + this.getClass().getSimpleName());
}
return INSN_CLONER.deepClone(this);
return copyCommonParams(new InsnNode(insnType, getArgsCount()));
}
public boolean canThrowException() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册