fix: incorrect init values of inherited fields

This commit is contained in:
Skylot
2019-07-13 13:10:23 +03:00
parent 49e234d9f8
commit ed9fe8a573
2 changed files with 75 additions and 3 deletions
@@ -92,7 +92,7 @@ public class ExtractFieldInit extends AbstractVisitor {
List<InsnNode> initInsns = getFieldAssigns(classInitMth, field, InsnType.SPUT);
if (initInsns.size() == 1) {
InsnNode insn = initInsns.get(0);
if (checkInsn(insn)) {
if (checkInsn(cls, insn)) {
InsnArg arg = insn.getArg(0);
if (arg instanceof InsnWrapArg) {
((InsnWrapArg) arg).getWrapInsn().add(AFlag.DECLARE_VAR);
@@ -137,7 +137,7 @@ public class ExtractFieldInit extends AbstractVisitor {
// TODO: check not only first block
BlockNode blockNode = constrMth.getBasicBlocks().get(0);
for (InsnNode insn : blockNode.getInstructions()) {
if (insn.getType() == InsnType.IPUT && checkInsn(insn)) {
if (insn.getType() == InsnType.IPUT && checkInsn(cls, insn)) {
info.getPutInsns().add(insn);
} else if (!info.getPutInsns().isEmpty()) {
break;
@@ -199,7 +199,22 @@ public class ExtractFieldInit extends AbstractVisitor {
return true;
}
private static boolean checkInsn(InsnNode insn) {
private static boolean checkInsn(ClassNode cls, InsnNode insn) {
if (insn instanceof IndexInsnNode) {
FieldInfo fieldInfo = (FieldInfo) ((IndexInsnNode) insn).getIndex();
if (!fieldInfo.getDeclClass().equals(cls.getClassInfo())) {
// exclude fields from super classes
return false;
}
FieldNode fieldNode = cls.dex().resolveField(fieldInfo);
if (fieldNode == null) {
// exclude inherited fields (not declared in this class)
return false;
}
} else {
return false;
}
InsnArg arg = insn.getArg(0);
if (arg.isInsnWrap()) {
InsnNode wrapInsn = ((InsnWrapArg) arg).getWrapInsn();