Call 'StackFrameProxy::visibleVariables()' in a safe way (KT-27462)

This commit is contained in:
Yan Zhulanow
2018-11-12 14:30:20 +09:00
parent 47657df8da
commit 03a6066ce0
3 changed files with 16 additions and 4 deletions
@@ -25,8 +25,7 @@ import org.jetbrains.kotlin.codegen.inline.isFakeLocalVariableForInline
class KotlinStackFrame(frame: StackFrameProxyImpl) : JavaStackFrame(StackFrameDescriptorImpl(frame, MethodsTracker()), true) {
override fun getVisibleVariables(): List<LocalVariableProxyImpl>? {
return super.getVisibleVariables().filter {
!isFakeLocalVariableForInline(it.name())
}
return super.getStackFrameProxy().visibleVariablesSafe()
.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.DebuggerManagerThreadImpl
import com.intellij.debugger.engine.evaluation.AbsentInformationEvaluateException
import com.intellij.debugger.engine.events.DebuggerCommandImpl
import com.intellij.debugger.impl.DebuggerContextImpl
import com.intellij.debugger.impl.DebuggerUtilsEx
import com.intellij.debugger.jdi.LocalVariableProxyImpl
import com.intellij.debugger.jdi.StackFrameProxyImpl
import com.intellij.psi.PsiElement
import com.sun.jdi.*
import com.sun.tools.jdi.LocalVariableImpl
@@ -30,6 +32,17 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.inline.InlineUtil
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> {
return DebuggerUtilsEx.allLineLocations(this) ?: emptyList()
}
@@ -523,7 +523,7 @@ private fun SuspendContextImpl.getNextPositionWithFilter(
}
fun getInlineRangeLocalVariables(stackFrame: StackFrameProxyImpl): List<LocalVariable> {
return stackFrame.visibleVariables()
return stackFrame.visibleVariablesSafe()
.filter {
val name = it.name()
name.startsWith(JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_FUNCTION)