diff --git a/dex-ir/src/main/java/com/googlecode/dex2jar/ir/ts/CleanLabel.java b/dex-ir/src/main/java/com/googlecode/dex2jar/ir/ts/CleanLabel.java
index 4696977b0..f51c1d3ed 100644
--- a/dex-ir/src/main/java/com/googlecode/dex2jar/ir/ts/CleanLabel.java
+++ b/dex-ir/src/main/java/com/googlecode/dex2jar/ir/ts/CleanLabel.java
@@ -1,13 +1,13 @@
/*
* dex2jar - Tools to work with android .dex and java .class files
* Copyright (c) 2009-2012 Panxiaobo
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -16,21 +16,20 @@
*/
package com.googlecode.dex2jar.ir.ts;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
import com.googlecode.dex2jar.ir.IrMethod;
import com.googlecode.dex2jar.ir.LocalVar;
import com.googlecode.dex2jar.ir.Trap;
import com.googlecode.dex2jar.ir.stmt.*;
import com.googlecode.dex2jar.ir.stmt.Stmt.ST;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
/**
* Clean unused {@link LabelStmt}
- *
+ *
* @author Panxiaobo
- *
*/
public class CleanLabel implements Transformer {
@@ -43,6 +42,7 @@ public void transform(IrMethod irMethod) {
if (irMethod.phiLabels != null) {
uselabels.addAll(irMethod.phiLabels);
}
+ addLineNumber(irMethod.stmts, uselabels);
rmUnused(irMethod.stmts, uselabels);
}
@@ -57,7 +57,7 @@ private void addVars(List vars, Set uselabels) {
}
private void rmUnused(StmtList stmts, Set uselabels) {
- for (Stmt p = stmts.getFirst(); p != null;) {
+ for (Stmt p = stmts.getFirst(); p != null; ) {
if (p.st == ST.LABEL) {
if (!uselabels.contains(p)) {
Stmt q = p.getNext();
@@ -96,4 +96,12 @@ private void addTrap(List traps, Set labels) {
}
}
+ // fix https://github.com/pxb1988/dex2jar/issues/165
+ private void addLineNumber(StmtList stmts, Set uselabels) {
+ for (Stmt p = stmts.getFirst(); p != null; p = p.getNext()) {
+ if (p instanceof LabelStmt && ((LabelStmt) p).lineNumber != -1) {
+ uselabels.add((LabelStmt) p);
+ }
+ }
+ }
}
diff --git a/dex-translator/src/main/java/com/googlecode/d2j/converter/Dex2IRConverter.java b/dex-translator/src/main/java/com/googlecode/d2j/converter/Dex2IRConverter.java
index 3fb02b031..b2955f3c3 100644
--- a/dex-translator/src/main/java/com/googlecode/d2j/converter/Dex2IRConverter.java
+++ b/dex-translator/src/main/java/com/googlecode/d2j/converter/Dex2IRConverter.java
@@ -5,6 +5,7 @@
import com.googlecode.d2j.Field;
import com.googlecode.d2j.Method;
import com.googlecode.d2j.node.DexCodeNode;
+import com.googlecode.d2j.node.DexDebugNode;
import com.googlecode.d2j.node.TryCatchNode;
import com.googlecode.d2j.node.analysis.DvmFrame;
import com.googlecode.d2j.node.analysis.DvmInterpreter;
@@ -97,7 +98,6 @@ public IrMethod convert(boolean isStatic, Method method, DexCodeNode dexCodeNode
dfs(exBranch, handlers, access, interpreter);
-
StmtList stmts = target.stmts;
stmts.addAll(preEmit);
for (int i = 0; i < insnList.size(); i++) {
@@ -169,9 +169,30 @@ public IrMethod convert(boolean isStatic, Method method, DexCodeNode dexCodeNode
target.phiLabels = phiLabels;
}
+ supplementLineNumber(dexCodeNode);
+
return target;
}
+ // fix https://github.com/pxb1988/dex2jar/issues/165
+ private void supplementLineNumber(DexCodeNode dexCodeNode) {
+ if (dexCodeNode == null || dexCodeNode.debugNode == null || dexCodeNode.debugNode.debugNodes == null) {
+ return;
+ }
+ Map lineNumber = new HashMap<>();
+ for (DexDebugNode.DexDebugOpNode debugNode : dexCodeNode.debugNode.debugNodes) {
+ if (debugNode instanceof DexDebugNode.DexDebugOpNode.LineNumber) {
+ lineNumber.put(debugNode.label, ((DexDebugNode.DexDebugOpNode.LineNumber) debugNode).line);
+ }
+ }
+ for (Map.Entry entry : map.entrySet()) {
+ Integer line = lineNumber.get(entry.getKey());
+ if (line != null) {
+ entry.getValue().lineNumber = line;
+ }
+ }
+ }
+
/**
* issue 63
*