Debugger: use StackFrameProxy from IDEA instead of StackFrame from JDI to show error message when debug info in corrupted

#EA-76187 - IE: FrameVisitor.findLocalVariable Fixed
This commit is contained in:
Natalia Ukhorskaya
2016-03-16 11:20:23 +03:00
parent 589d7007fc
commit 5b489d1986
3 changed files with 6 additions and 4 deletions
+1
View File
@@ -24,3 +24,4 @@
- Debugger can distinguish nested inline arguments
- Add kotlinClassName() and kotlinFunctionName() macros for use in live templates
- Complete private members from libraries in Evaluate Expression dialog
- Show error message when debug info for some local variable is corrupted
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.idea.debugger
import com.intellij.debugger.engine.DebugProcessImpl
import com.intellij.debugger.jdi.LocalVariableProxyImpl
import com.sun.jdi.*
import com.sun.tools.jdi.LocalVariableImpl
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
@@ -28,11 +29,11 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.inline.InlineUtil
import java.util.*
fun isInsideInlineFunctionBody(visibleVariables: List<LocalVariable>): Boolean {
fun isInsideInlineFunctionBody(visibleVariables: List<LocalVariableProxyImpl>): Boolean {
return visibleVariables.any { it.name().startsWith(JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_FUNCTION) }
}
fun numberOfInlinedFunctions(visibleVariables: List<LocalVariable>): Int {
fun numberOfInlinedFunctions(visibleVariables: List<LocalVariableProxyImpl>): Int {
return visibleVariables.count { it.name().startsWith(JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_FUNCTION) }
}
@@ -36,7 +36,7 @@ import org.jetbrains.org.objectweb.asm.Type
class FrameVisitor(context: EvaluationContextImpl) {
private val project = context.debugProcess.project
private val frame = context.frameProxy?.stackFrame
private val frame = context.frameProxy
companion object {
val OBJECT_TYPE = Type.getType(Any::class.java)
@@ -192,7 +192,7 @@ class FrameVisitor(context: EvaluationContextImpl) {
private fun getField(owner: Value, name: String, asmType: Type?, checkType: Boolean): Value? {
try {
val obj = owner.asJdiValue(frame!!.virtualMachine(), owner.asmType)
val obj = owner.asJdiValue(frame!!.virtualMachine.virtualMachine, owner.asmType)
if (obj !is ObjectReference) return null
val _class = obj.referenceType()