From 2dbdd1f0794f01362ba10856a60b2150fdd6bd24 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 13 Jul 2019 13:19:58 +0300 Subject: [PATCH] fix: support instructions removing in SimplifyVisitor --- .../core/dex/visitors/SimplifyVisitor.java | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/SimplifyVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/SimplifyVisitor.java index f60608a6a..0eb7e6eb1 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/SimplifyVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/SimplifyVisitor.java @@ -50,24 +50,36 @@ public class SimplifyVisitor extends AbstractVisitor { return; } for (BlockNode block : mth.getBasicBlocks()) { - List list = block.getInstructions(); - for (int i = 0; i < list.size(); i++) { - InsnNode modInsn = simplifyInsn(mth, list.get(i)); - if (modInsn != null) { - if (i != 0 && modInsn.contains(AFlag.ARITH_ONEARG)) { + simplifyBlock(mth, block); + } + } - InsnNode mergedNode = simplifyOneArgConsecutive( - list.get(i - 1), list.get(i), (ArithNode) modInsn); + private static void simplifyBlock(MethodNode mth, BlockNode block) { + List list = block.getInstructions(); + for (int i = 0; i < list.size(); i++) { + InsnNode insn = list.get(i); + int insnCount = list.size(); + InsnNode modInsn = simplifyInsn(mth, insn); + if (modInsn != null) { + if (i != 0 && modInsn.contains(AFlag.ARITH_ONEARG)) { + InsnNode mergedNode = simplifyOneArgConsecutive( + list.get(i - 1), list.get(i), (ArithNode) modInsn); - if (mergedNode != null) { - list.remove(i - 1); - modInsn = mergedNode; - i--; - } + if (mergedNode != null) { + list.remove(i - 1); + modInsn = mergedNode; + i--; } + } + if (i < list.size() && list.get(i) == insn) { list.set(i, modInsn); } } + if (list.size() < insnCount) { + // some insns removed => restart block processing + simplifyBlock(mth, block); + return; + } } }