From 32f94b463f674ca5d7a1f7f7de58a13060d2be16 Mon Sep 17 00:00:00 2001 From: Skylot Date: Wed, 7 Feb 2018 21:20:05 +0300 Subject: [PATCH] core: add code lines for while loop --- .../java/jadx/core/codegen/RegionGen.java | 6 +++-- .../core/dex/regions/loops/LoopRegion.java | 26 ++++++++++++++----- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/codegen/RegionGen.java b/jadx-core/src/main/java/jadx/core/codegen/RegionGen.java index 2efa5ba2e..df353b22e 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/RegionGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/RegionGen.java @@ -207,11 +207,13 @@ public class RegionGen extends InsnGen { if (region.isConditionAtEnd()) { code.startLine("do {"); makeRegionIndent(code, region.getBody()); - code.startLine("} while ("); + code.startLineWithNum(region.getConditionSourceLine()); + code.add("} while ("); conditionGen.add(code, condition); code.add(");"); } else { - code.startLine("while ("); + code.startLineWithNum(region.getConditionSourceLine()); + code.add("while ("); conditionGen.add(code, condition); code.add(") {"); makeRegionIndent(code, region.getBody()); diff --git a/jadx-core/src/main/java/jadx/core/dex/regions/loops/LoopRegion.java b/jadx-core/src/main/java/jadx/core/dex/regions/loops/LoopRegion.java index a7cbfd74c..073561e67 100644 --- a/jadx-core/src/main/java/jadx/core/dex/regions/loops/LoopRegion.java +++ b/jadx-core/src/main/java/jadx/core/dex/regions/loops/LoopRegion.java @@ -1,5 +1,9 @@ package jadx.core.dex.regions.loops; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + import jadx.core.dex.attributes.nodes.LoopInfo; import jadx.core.dex.instructions.IfNode; import jadx.core.dex.instructions.args.RegisterArg; @@ -9,15 +13,15 @@ import jadx.core.dex.nodes.IRegion; import jadx.core.dex.nodes.InsnNode; import jadx.core.dex.regions.AbstractRegion; import jadx.core.dex.regions.conditions.IfCondition; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import org.jetbrains.annotations.Nullable; public final class LoopRegion extends AbstractRegion { private final LoopInfo info; - // loop header contains one 'if' insn, equals null for infinite loop + /** + * loop header contains one 'if' insn, equals null for infinite loop + */ + @Nullable private IfCondition condition; private final BlockNode conditionBlock; // instruction which must be executed before condition in every loop @@ -27,7 +31,7 @@ public final class LoopRegion extends AbstractRegion { private LoopType type; - public LoopRegion(IRegion parent, LoopInfo info, BlockNode header, boolean reversed) { + public LoopRegion(IRegion parent, LoopInfo info, @Nullable BlockNode header, boolean reversed) { super(parent); this.info = info; this.conditionBlock = header; @@ -126,6 +130,16 @@ public final class LoopRegion extends AbstractRegion { } } + public int getConditionSourceLine() { + if (conditionBlock != null) { + List condInsns = conditionBlock.getInstructions(); + if (!condInsns.isEmpty()) { + return condInsns.get(0).getSourceLine(); + } + } + return 0; + } + public LoopType getType() { return type; }