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 *