From 03a6066ce02547c45ffd74818c1227c55439799b Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Mon, 12 Nov 2018 14:30:20 +0900 Subject: [PATCH] Call 'StackFrameProxy::visibleVariables()' in a safe way (KT-27462) --- .../kotlin/idea/debugger/KotlinStackFrame.kt | 5 ++--- .../jetbrains/kotlin/idea/debugger/debuggerUtil.kt | 13 +++++++++++++ .../stepping/KotlinSteppingCommandProvider.kt | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/KotlinStackFrame.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/KotlinStackFrame.kt index 15694b479fe..cdd0e384651 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/KotlinStackFrame.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/KotlinStackFrame.kt @@ -25,8 +25,7 @@ import org.jetbrains.kotlin.codegen.inline.isFakeLocalVariableForInline class KotlinStackFrame(frame: StackFrameProxyImpl) : JavaStackFrame(StackFrameDescriptorImpl(frame, MethodsTracker()), true) { override fun getVisibleVariables(): List? { - return super.getVisibleVariables().filter { - !isFakeLocalVariableForInline(it.name()) - } + return super.getStackFrameProxy().visibleVariablesSafe() + .filter { !isFakeLocalVariableForInline(it.name()) } } } \ No newline at end of file diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/debuggerUtil.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/debuggerUtil.kt index 53224102643..2334dc3f152 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/debuggerUtil.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/debuggerUtil.kt @@ -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 { + 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 { return DebuggerUtilsEx.allLineLocations(this) ?: emptyList() } diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt index 908c5a8c515..356ac09bf16 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/stepping/KotlinSteppingCommandProvider.kt @@ -523,7 +523,7 @@ private fun SuspendContextImpl.getNextPositionWithFilter( } fun getInlineRangeLocalVariables(stackFrame: StackFrameProxyImpl): List { - return stackFrame.visibleVariables() + return stackFrame.visibleVariablesSafe() .filter { val name = it.name() name.startsWith(JvmAbi.LOCAL_VARIABLE_NAME_PREFIX_INLINE_FUNCTION)