diff --git a/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestLineNumbers3.java b/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestLineNumbers3.java new file mode 100644 index 000000000..465d28109 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/debuginfo/TestLineNumbers3.java @@ -0,0 +1,39 @@ +package jadx.tests.integration.debuginfo; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.IntegrationTest; +import jadx.tests.api.extensions.inputs.InputPlugin; +import jadx.tests.api.extensions.inputs.TestWithInputPlugins; + +import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; + +public class TestLineNumbers3 extends IntegrationTest { + + public static class TestCls extends Exception { + + public TestCls(final Object message) { + super((message == null) ? "" : message.toString()); + /* + * comment to increase line number in return instruction + * - + * - + * - + * - + * - + * - + * - + * - + * - + * - + */ + } + } + + @TestWithInputPlugins({ InputPlugin.DEX, InputPlugin.JAVA }) + public void test() { + ClassNode cls = getClassNode(TestCls.class); + assertThat(cls).code().containsOne("super(message == null ? \"\" : message.toString());"); + String linesMapStr = cls.getCode().getLineMapping().toString(); + assertThat(linesMapStr).isEqualTo("{4=13, 5=14, 6=15}"); + } +} diff --git a/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/sections/debuginfo/DebugInfoParser.java b/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/sections/debuginfo/DebugInfoParser.java index 28e827d9c..3973919b6 100644 --- a/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/sections/debuginfo/DebugInfoParser.java +++ b/jadx-plugins/jadx-dex-input/src/main/java/jadx/plugins/input/dex/sections/debuginfo/DebugInfoParser.java @@ -185,25 +185,16 @@ public class DebugInfoParser { } } } - setSourceLines(addr, codeSize, line); return new DebugInfo(linesMap, resultList); } private int addrChange(int addr, int addrInc, int line) { - int newAddr = addr + addrInc; - int maxAddr = codeSize - 1; - newAddr = Math.min(newAddr, maxAddr); - setSourceLines(addr, newAddr, line); + int newAddr = Math.min(addr + addrInc, codeSize - 1); + setLine(newAddr, line); return newAddr; } - private void setSourceLines(int start, int end, int line) { - for (int offset = start + 1; offset < end; offset++) { - setLine(offset, line); - } - } - private void setLine(int offset, int line) { linesMap.put(offset, line); }