More emulate debugging after dexing - dex removes several lines mapped to one instruction

(cherry picked from commit 1b7d4ef)
This commit is contained in:
Nikolay Krasko
2016-08-01 13:06:36 +03:00
committed by Nikolay Krasko
parent 9264c876f8
commit ef602be98e
@@ -16,11 +16,9 @@
package org.jetbrains.kotlin.idea.debugger
import org.jetbrains.org.objectweb.asm.ClassReader
import org.jetbrains.org.objectweb.asm.ClassVisitor
import org.jetbrains.org.objectweb.asm.ClassWriter
import org.jetbrains.org.objectweb.asm.Opcodes
import org.jetbrains.org.objectweb.asm.*
import java.io.File
import java.util.*
val DEX_BEFORE_PATCH_EXTENSION = "before_dex"
@@ -38,6 +36,7 @@ private fun applyDexLikePatch(file: File) {
val visitor = writer
.withRemoveSourceDebugExtensionVisitor()
.withRemoveSameLinesInLineTableVisitor()
reader.accept(visitor, 0)
@@ -50,4 +49,24 @@ private fun ClassVisitor.withRemoveSourceDebugExtensionVisitor(): ClassVisitor {
super.visitSource(source, null)
}
}
}
}
private fun ClassVisitor.withRemoveSameLinesInLineTableVisitor(): ClassVisitor {
return object : ClassVisitor(Opcodes.ASM5, this) {
override fun visitMethod(access: Int, name: String?, desc: String?, signature: String?, exceptions: Array<out String>?): MethodVisitor? {
val methodVisitor = super.visitMethod(access, name, desc, signature, exceptions) ?: return null
return object : MethodVisitor(Opcodes.ASM5, methodVisitor) {
val labels = HashSet<String>()
override fun visitLineNumber(line: Int, start: Label?) {
val added = labels.add(start.toString())
if (added) {
super.visitLineNumber(line, start)
}
}
}
}
}
}