From 484e07df8d1187e81c16a0db49056cdaf9230904 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 27 Apr 2013 21:03:01 +0400 Subject: [PATCH] Fix setting variable name from debug info --- .../dex/nodes/parser/DebugInfoParser.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/jadx/dex/nodes/parser/DebugInfoParser.java b/src/main/java/jadx/dex/nodes/parser/DebugInfoParser.java index dc97fcac7..35f8e35e8 100644 --- a/src/main/java/jadx/dex/nodes/parser/DebugInfoParser.java +++ b/src/main/java/jadx/dex/nodes/parser/DebugInfoParser.java @@ -78,8 +78,7 @@ public class DebugInfoParser { int nameId = section.readUleb128() - 1; int type = section.readUleb128() - 1; LocalVarInfo var = new LocalVarInfo(dex, regNum, nameId, type, DexNode.NO_INDEX); - var.start(addr, line); - locals[regNum] = var; + startVar(var, locals, insnByOffset, addr, line); break; } case DBG_START_LOCAL_EXTENDED: { @@ -88,15 +87,17 @@ public class DebugInfoParser { int type = section.readUleb128() - 1; int sign = section.readUleb128() - 1; LocalVarInfo var = new LocalVarInfo(dex, regNum, nameId, type, sign); - var.start(addr, line); - locals[regNum] = var; + startVar(var, locals, insnByOffset, addr, line); break; } case DBG_RESTART_LOCAL: { int regNum = section.readUleb128(); LocalVarInfo var = locals[regNum]; - if (var != null) + if (var != null) { + var.end(addr, line); + setVar(var, insnByOffset); var.start(addr, line); + } break; } case DBG_END_LOCAL: { @@ -141,6 +142,17 @@ public class DebugInfoParser { } } + private void startVar(LocalVarInfo var, LocalVarInfo[] locals, InsnNode[] insnByOffset, int addr, int line) { + int regNum = var.getRegNum(); + LocalVarInfo prev = locals[regNum]; + if (prev != null && !prev.isEnd()) { + prev.end(addr, line); + setVar(prev, insnByOffset); + } + var.start(addr, line); + locals[regNum] = var; + } + private void setVar(LocalVarInfo var, InsnNode[] insnByOffset) { int start = var.getStartAddr(); int end = var.getEndAddr();