Call 'StackFrameProxy::visibleVariables()' in a safe way (KT-27462)
This commit is contained in:
@@ -25,8 +25,7 @@ import org.jetbrains.kotlin.codegen.inline.isFakeLocalVariableForInline
|
|||||||
|
|
||||||
class KotlinStackFrame(frame: StackFrameProxyImpl) : JavaStackFrame(StackFrameDescriptorImpl(frame, MethodsTracker()), true) {
|
class KotlinStackFrame(frame: StackFrameProxyImpl) : JavaStackFrame(StackFrameDescriptorImpl(frame, MethodsTracker()), true) {
|
||||||
override fun getVisibleVariables(): List<LocalVariableProxyImpl>? {
|
override fun getVisibleVariables(): List<LocalVariableProxyImpl>? {
|
||||||
return super.getVisibleVariables().filter {
|
return super.getStackFrameProxy().visibleVariablesSafe()
|
||||||
!isFakeLocalVariableForInline(it.name())
|
.filter { !isFakeLocalVariableForInline(it.name()) }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,10 +7,12 @@ package org.jetbrains.kotlin.idea.debugger
|
|||||||
|
|
||||||
import com.intellij.debugger.engine.DebugProcessImpl
|
import com.intellij.debugger.engine.DebugProcessImpl
|
||||||
import com.intellij.debugger.engine.DebuggerManagerThreadImpl
|
import com.intellij.debugger.engine.DebuggerManagerThreadImpl
|
||||||
|
import com.intellij.debugger.engine.evaluation.AbsentInformationEvaluateException
|
||||||
import com.intellij.debugger.engine.events.DebuggerCommandImpl
|
import com.intellij.debugger.engine.events.DebuggerCommandImpl
|
||||||
import com.intellij.debugger.impl.DebuggerContextImpl
|
import com.intellij.debugger.impl.DebuggerContextImpl
|
||||||
import com.intellij.debugger.impl.DebuggerUtilsEx
|
import com.intellij.debugger.impl.DebuggerUtilsEx
|
||||||
import com.intellij.debugger.jdi.LocalVariableProxyImpl
|
import com.intellij.debugger.jdi.LocalVariableProxyImpl
|
||||||
|
import com.intellij.debugger.jdi.StackFrameProxyImpl
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.sun.jdi.*
|
import com.sun.jdi.*
|
||||||
import com.sun.tools.jdi.LocalVariableImpl
|
import com.sun.tools.jdi.LocalVariableImpl
|
||||||
@@ -30,6 +32,17 @@ import org.jetbrains.kotlin.resolve.BindingContext
|
|||||||
import org.jetbrains.kotlin.resolve.inline.InlineUtil
|
import org.jetbrains.kotlin.resolve.inline.InlineUtil
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
fun StackFrameProxyImpl.visibleVariablesSafe(): List<LocalVariableProxyImpl> {
|
||||||
|
try {
|
||||||
|
return visibleVariables()
|
||||||
|
} catch (e: AbsentInformationEvaluateException) {
|
||||||
|
// Current implementation of visibleVariables() wraps an AbsentInformationException into EvaluateException
|
||||||
|
return emptyList()
|
||||||
|
} catch (e: AbsentInformationException) {
|
||||||
|
return emptyList()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun Method.safeAllLineLocations(): List<Location> {
|
fun Method.safeAllLineLocations(): List<Location> {
|
||||||
return DebuggerUtilsEx.allLineLocations(this) ?: emptyList()
|
return DebuggerUtilsEx.allLineLocations(this) ?: emptyList()
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -523,7 +523,7 @@ private fun SuspendContextImpl.getNextPositionWithFilter(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getInlineRangeLocalVariables(stackFrame: StackFrameProxyImpl): List<LocalVariable> {
|
fun getInlineRangeLocalVariables(stackFrame: StackFrameProxyImpl): List<LocalVariable> {
|
||||||
return stackFrame.visibleVariables()
|
return stackFrame.visibleVariablesSafe()
|
||||||
.filter {
|
.filter {
|
||||||
val name = it.name()
|
val name = it.name()
|
||||||
name.startsWith(JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_FUNCTION)
|
name.startsWith(JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_FUNCTION)
|
||||||
|
|||||||
Reference in New Issue
Block a user