Commit 7f4da306 authored by Skylot's avatar Skylot

refactor: remove cloning library dependency

parent 424a8ffa
...@@ -7,7 +7,6 @@ dependencies { ...@@ -7,7 +7,6 @@ dependencies {
compile 'org.ow2.asm:asm:7.1' compile 'org.ow2.asm:asm:7.1'
compile 'org.jetbrains:annotations:17.0.0' 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 'com.google.code.gson:gson:2.8.5'
compile 'org.smali:baksmali:2.2.7' compile 'org.smali:baksmali:2.2.7'
......
...@@ -72,6 +72,11 @@ public class ArithNode extends InsnNode { ...@@ -72,6 +72,11 @@ public class ArithNode extends InsnNode {
} }
@Override @Override
public InsnNode copy() {
return copyCommonParams(new ArithNode(op, getResult(), getArg(0), getArg(1)));
}
@Override
public String toString() { public String toString() {
return InsnUtils.formatOffset(offset) + ": " return InsnUtils.formatOffset(offset) + ": "
+ InsnUtils.insnTypeToString(insnType) + InsnUtils.insnTypeToString(insnType)
......
...@@ -25,13 +25,15 @@ public final class FillArrayNode extends InsnNode { ...@@ -25,13 +25,15 @@ public final class FillArrayNode extends InsnNode {
private ArgType elemType; private ArgType elemType;
public FillArrayNode(int resReg, FillArrayDataPayloadDecodedInstruction payload) { public FillArrayNode(int resReg, FillArrayDataPayloadDecodedInstruction payload) {
super(InsnType.FILL_ARRAY, 1); this(payload.getData(), payload.getSize(), getElementType(payload.getElementWidthUnit()));
ArgType elType = getElementType(payload.getElementWidthUnit()); addArg(InsnArg.reg(resReg, ArgType.array(elemType)));
addArg(InsnArg.reg(resReg, ArgType.array(elType))); }
this.data = payload.getData(); private FillArrayNode(Object data, int size, ArgType elemType) {
this.size = payload.getSize(); super(InsnType.FILL_ARRAY, 1);
this.elemType = elType; this.data = data;
this.size = size;
this.elemType = elemType;
} }
private static ArgType getElementType(short elementWidthUnit) { private static ArgType getElementType(short elementWidthUnit) {
...@@ -98,6 +100,11 @@ public final class FillArrayNode extends InsnNode { ...@@ -98,6 +100,11 @@ public final class FillArrayNode extends InsnNode {
return elemType.equals(other.elemType) && data == other.data; return elemType.equals(other.elemType) && data == other.data;
} }
@Override
public InsnNode copy() {
return copyCommonParams(new FillArrayNode(data, size, elemType));
}
public String dataToString() { public String dataToString() {
if (data instanceof int[]) { if (data instanceof int[]) {
return Arrays.toString((int[]) data); return Arrays.toString((int[]) data);
......
...@@ -35,6 +35,11 @@ public class FilledNewArrayNode extends InsnNode { ...@@ -35,6 +35,11 @@ public class FilledNewArrayNode extends InsnNode {
} }
@Override @Override
public InsnNode copy() {
return copyCommonParams(new FilledNewArrayNode(elemType, getArgsCount()));
}
@Override
public String toString() { public String toString() {
return super.toString() + " elemType: " + elemType; return super.toString() + " elemType: " + elemType;
} }
......
package jadx.core.dex.instructions; package jadx.core.dex.instructions;
import jadx.core.dex.nodes.InsnNode;
import jadx.core.utils.InsnUtils; import jadx.core.utils.InsnUtils;
public class GotoNode extends TargetInsnNode { public class GotoNode extends TargetInsnNode {
...@@ -20,6 +21,11 @@ public class GotoNode extends TargetInsnNode { ...@@ -20,6 +21,11 @@ public class GotoNode extends TargetInsnNode {
} }
@Override @Override
public InsnNode copy() {
return copyCommonParams(new GotoNode(target));
}
@Override
public String toString() { public String toString() {
return super.toString() + "-> " + InsnUtils.formatOffset(target); return super.toString() + "-> " + InsnUtils.formatOffset(target);
} }
......
...@@ -34,12 +34,16 @@ public class IfNode extends GotoNode { ...@@ -34,12 +34,16 @@ public class IfNode extends GotoNode {
} }
public IfNode(IfOp op, int targetOffset, InsnArg arg1, InsnArg arg2) { public IfNode(IfOp op, int targetOffset, InsnArg arg1, InsnArg arg2) {
super(InsnType.IF, targetOffset, 2); this(op, targetOffset);
this.op = op;
addArg(arg1); addArg(arg1);
addArg(arg2); addArg(arg2);
} }
private IfNode(IfOp op, int targetOffset) {
super(InsnType.IF, targetOffset, 2);
this.op = op;
}
// change default types priority // change default types priority
private static final ArgType WIDE_TYPE = ArgType.unknown( private static final ArgType WIDE_TYPE = ArgType.unknown(
PrimitiveType.INT, PrimitiveType.BOOLEAN, PrimitiveType.INT, PrimitiveType.BOOLEAN,
...@@ -124,6 +128,14 @@ public class IfNode extends GotoNode { ...@@ -124,6 +128,14 @@ public class IfNode extends GotoNode {
} }
@Override @Override
public InsnNode copy() {
IfNode copy = new IfNode(op, target);
copy.thenBlock = thenBlock;
copy.elseBlock = elseBlock;
return copyCommonParams(copy);
}
@Override
public String toString() { public String toString() {
return InsnUtils.formatOffset(offset) + ": " return InsnUtils.formatOffset(offset) + ": "
+ InsnUtils.insnTypeToString(insnType) + InsnUtils.insnTypeToString(insnType)
......
...@@ -12,12 +12,16 @@ public class NewArrayNode extends InsnNode { ...@@ -12,12 +12,16 @@ public class NewArrayNode extends InsnNode {
private final ArgType arrType; private final ArgType arrType;
public NewArrayNode(@NotNull ArgType arrType, RegisterArg res, InsnArg size) { public NewArrayNode(@NotNull ArgType arrType, RegisterArg res, InsnArg size) {
super(InsnType.NEW_ARRAY, 1); this(arrType);
this.arrType = arrType;
setResult(res); setResult(res);
addArg(size); addArg(size);
} }
private NewArrayNode(ArgType arrType) {
super(InsnType.NEW_ARRAY, 1);
this.arrType = arrType;
}
public ArgType getArrayType() { public ArgType getArrayType() {
return arrType; return arrType;
} }
...@@ -35,6 +39,11 @@ public class NewArrayNode extends InsnNode { ...@@ -35,6 +39,11 @@ public class NewArrayNode extends InsnNode {
} }
@Override @Override
public InsnNode copy() {
return copyCommonParams(new NewArrayNode(arrType));
}
@Override
public String toString() { public String toString() {
return super.toString() + " type: " + arrType; return super.toString() + " type: " + arrType;
} }
......
...@@ -21,13 +21,17 @@ public final class PhiInsn extends InsnNode { ...@@ -21,13 +21,17 @@ public final class PhiInsn extends InsnNode {
private final List<BlockNode> blockBinds; private final List<BlockNode> blockBinds;
public PhiInsn(int regNum, int predecessors) { public PhiInsn(int regNum, int predecessors) {
super(InsnType.PHI, predecessors); this(predecessors);
this.blockBinds = new ArrayList<>(predecessors);
setResult(InsnArg.reg(regNum, ArgType.UNKNOWN)); setResult(InsnArg.reg(regNum, ArgType.UNKNOWN));
add(AFlag.DONT_INLINE); add(AFlag.DONT_INLINE);
add(AFlag.DONT_GENERATE); add(AFlag.DONT_GENERATE);
} }
private PhiInsn(int argsCount) {
super(InsnType.PHI, argsCount);
this.blockBinds = new ArrayList<>(argsCount);
}
public RegisterArg bindArg(BlockNode pred) { public RegisterArg bindArg(BlockNode pred) {
RegisterArg arg = InsnArg.reg(getResult().getRegNum(), getResult().getInitType()); RegisterArg arg = InsnArg.reg(getResult().getRegNum(), getResult().getInitType());
bindArg(arg, pred); bindArg(arg, pred);
...@@ -112,6 +116,11 @@ public final class PhiInsn extends InsnNode { ...@@ -112,6 +116,11 @@ public final class PhiInsn extends InsnNode {
} }
@Override @Override
public InsnNode copy() {
return copyCommonParams(new PhiInsn(getArgsCount()));
}
@Override
public String toString() { public String toString() {
return "PHI: " + getResult() + " = " + Utils.listToString(getArguments()) return "PHI: " + getResult() + " = " + Utils.listToString(getArguments())
+ " binds: " + blockBinds; + " binds: " + blockBinds;
......
...@@ -20,11 +20,15 @@ public class SwitchNode extends TargetInsnNode { ...@@ -20,11 +20,15 @@ public class SwitchNode extends TargetInsnNode {
private BlockNode defTargetBlock; private BlockNode defTargetBlock;
public SwitchNode(InsnArg arg, Object[] keys, int[] targets, int def) { 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); super(InsnType.SWITCH, 1);
this.keys = keys; this.keys = keys;
this.targets = targets; this.targets = targets;
this.def = def; this.def = def;
addArg(arg);
} }
public int getCasesCount() { public int getCasesCount() {
...@@ -97,6 +101,14 @@ public class SwitchNode extends TargetInsnNode { ...@@ -97,6 +101,14 @@ public class SwitchNode extends TargetInsnNode {
} }
@Override @Override
public InsnNode copy() {
SwitchNode copy = new SwitchNode(keys, targets, def);
copy.targetBlocks = targetBlocks;
copy.defTargetBlock = defTargetBlock;
return copyCommonParams(copy);
}
@Override
public String toString() { public String toString() {
StringBuilder targ = new StringBuilder(); StringBuilder targ = new StringBuilder();
targ.append('['); targ.append('[');
......
...@@ -105,6 +105,11 @@ public class ConstructorInsn extends InsnNode implements CallMthInterface { ...@@ -105,6 +105,11 @@ public class ConstructorInsn extends InsnNode implements CallMthInterface {
} }
@Override @Override
public InsnNode copy() {
return copyCommonParams(new ConstructorInsn(callMth, callType, instanceArg));
}
@Override
public String toString() { public String toString() {
return super.toString() + ' ' + callMth + ' ' + callType; return super.toString() + ' ' + callMth + ' ' + callType;
} }
......
...@@ -16,7 +16,7 @@ public final class TernaryInsn extends InsnNode { ...@@ -16,7 +16,7 @@ public final class TernaryInsn extends InsnNode {
private IfCondition condition; private IfCondition condition;
public TernaryInsn(IfCondition condition, RegisterArg result, InsnArg th, InsnArg els) { public TernaryInsn(IfCondition condition, RegisterArg result, InsnArg th, InsnArg els) {
super(InsnType.TERNARY, 2); this();
setResult(result); setResult(result);
if (th.equals(LiteralArg.FALSE) && els.equals(LiteralArg.TRUE)) { if (th.equals(LiteralArg.FALSE) && els.equals(LiteralArg.TRUE)) {
...@@ -31,6 +31,10 @@ public final class TernaryInsn extends InsnNode { ...@@ -31,6 +31,10 @@ public final class TernaryInsn extends InsnNode {
} }
} }
private TernaryInsn() {
super(InsnType.TERNARY, 2);
}
public IfCondition getCondition() { public IfCondition getCondition() {
return condition; return condition;
} }
...@@ -68,6 +72,13 @@ public final class TernaryInsn extends InsnNode { ...@@ -68,6 +72,13 @@ public final class TernaryInsn extends InsnNode {
} }
@Override @Override
public InsnNode copy() {
TernaryInsn copy = new TernaryInsn();
copy.condition = condition;
return copyCommonParams(copy);
}
@Override
public String toString() { public String toString() {
return InsnUtils.formatOffset(offset) + ": TERNARY" return InsnUtils.formatOffset(offset) + ": TERNARY"
+ getResult() + " = " + getResult() + " = "
......
...@@ -9,7 +9,6 @@ import java.util.Objects; ...@@ -9,7 +9,6 @@ import java.util.Objects;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import com.android.dx.io.instructions.DecodedInstruction; import com.android.dx.io.instructions.DecodedInstruction;
import com.rits.cloning.Cloner;
import jadx.core.dex.attributes.AFlag; import jadx.core.dex.attributes.AFlag;
import jadx.core.dex.attributes.nodes.LineAttrNode; import jadx.core.dex.attributes.nodes.LineAttrNode;
...@@ -17,23 +16,14 @@ import jadx.core.dex.instructions.InsnType; ...@@ -17,23 +16,14 @@ import jadx.core.dex.instructions.InsnType;
import jadx.core.dex.instructions.args.ArgType; import jadx.core.dex.instructions.args.ArgType;
import jadx.core.dex.instructions.args.InsnArg; import jadx.core.dex.instructions.args.InsnArg;
import jadx.core.dex.instructions.args.InsnWrapArg; 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.RegisterArg;
import jadx.core.dex.instructions.args.SSAVar; import jadx.core.dex.instructions.args.SSAVar;
import jadx.core.utils.InsnRemover; import jadx.core.utils.InsnRemover;
import jadx.core.utils.InsnUtils; import jadx.core.utils.InsnUtils;
import jadx.core.utils.Utils; import jadx.core.utils.Utils;
import jadx.core.utils.exceptions.JadxRuntimeException;
public class InsnNode extends LineAttrNode { 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; protected final InsnType insnType;
private RegisterArg result; private RegisterArg result;
...@@ -324,7 +314,7 @@ public class InsnNode extends LineAttrNode { ...@@ -324,7 +314,7 @@ public class InsnNode extends LineAttrNode {
&& Objects.equals(arguments, other.arguments); && 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); copy.setResult(result);
if (copy.getArgsCount() == 0) { if (copy.getArgsCount() == 0) {
for (InsnArg arg : this.getArguments()) { for (InsnArg arg : this.getArguments()) {
...@@ -346,10 +336,10 @@ public class InsnNode extends LineAttrNode { ...@@ -346,10 +336,10 @@ public class InsnNode extends LineAttrNode {
* Make copy of InsnNode object. * Make copy of InsnNode object.
*/ */
public InsnNode copy() { public InsnNode copy() {
if (this.getClass() == InsnNode.class) { if (this.getClass() != InsnNode.class) {
return copyCommonParams(new InsnNode(insnType, getArgsCount())); 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() { public boolean canThrowException() {
......
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