From 38622d8d926c36c2e3866ecab278dac2ed5bb9cd Mon Sep 17 00:00:00 2001 From: Vladimir Ilmov Date: Fri, 24 Apr 2020 14:58:40 +0200 Subject: [PATCH] (CoroutineDebugger) SkipCoroutineStackFrameProxy logic added --- .../coroutine/CoroutineStackFrameInterceptor.kt | 2 -- .../coroutine/util/CoroutineFrameBuilder.kt | 3 ++- .../view/XDebuggerTreeSelectedNodeListener.kt | 15 ++++++--------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/CoroutineStackFrameInterceptor.kt b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/CoroutineStackFrameInterceptor.kt index 75da2436a26..2bb685a8eac 100644 --- a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/CoroutineStackFrameInterceptor.kt +++ b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/CoroutineStackFrameInterceptor.kt @@ -27,8 +27,6 @@ class CoroutineStackFrameInterceptor(val project: Project) : StackFrameIntercept isInUnitTest() -> debugProcess.suspendManager.pausedContext else -> debugProcess.debuggerContext.suspendContext } - if (!isInUnitTest()) - assert(debugProcess.suspendManager.pausedContext === debugProcess.debuggerContext.suspendContext) suspendContextImpl?.let { CoroutineFrameBuilder.coroutineExitFrame(frame, it) } diff --git a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/util/CoroutineFrameBuilder.kt b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/util/CoroutineFrameBuilder.kt index f3e32ad88d2..0167855dcdb 100644 --- a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/util/CoroutineFrameBuilder.kt +++ b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/util/CoroutineFrameBuilder.kt @@ -13,6 +13,7 @@ import com.intellij.debugger.ui.impl.watch.StackFrameDescriptorImpl import com.sun.jdi.ObjectReference import org.jetbrains.kotlin.idea.debugger.coroutine.data.* import org.jetbrains.kotlin.idea.debugger.coroutine.proxy.ContinuationHolder +import org.jetbrains.kotlin.idea.debugger.coroutine.proxy.SkipCoroutineStackFrameProxyImpl import java.lang.Integer.min @@ -82,7 +83,7 @@ class CoroutineFrameBuilder { ): RunningCoroutineStackFrameItem? { val location = frame.location() return if (!location.safeCoroutineExitPointLineNumber()) - RunningCoroutineStackFrameItem(frame, location) + RunningCoroutineStackFrameItem(SkipCoroutineStackFrameProxyImpl(frame), location) else null } diff --git a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/view/XDebuggerTreeSelectedNodeListener.kt b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/view/XDebuggerTreeSelectedNodeListener.kt index 648f4ec6e5f..c395807da60 100644 --- a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/view/XDebuggerTreeSelectedNodeListener.kt +++ b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/view/XDebuggerTreeSelectedNodeListener.kt @@ -58,11 +58,7 @@ class XDebuggerTreeSelectedNodeListener(val session: XDebugSession, val tree: XD is RunningCoroutineStackFrameItem -> { val threadProxy = stackFrameItem.frame.threadProxy() val isCurrentContext = suspendContext.thread == threadProxy - val executionStack = suspendContext.invokeInManagerThread { JavaExecutionStack( - threadProxy, - debugProcess, - isCurrentContext) } ?: return false - createStackAndSetFrame(threadProxy, { executionStack.createStackFrame(stackFrameItem.frame) }, isCurrentContext) + createStackAndSetFrame(threadProxy, { it.createStackFrame(stackFrameItem.frame) }, isCurrentContext) } is CreationCoroutineStackFrameItem -> { val position = stackFrameItem.stackTraceElement.findPosition(session.project) ?: return false @@ -114,12 +110,13 @@ class XDebuggerTreeSelectedNodeListener(val session: XDebugSession, val tree: XD fun createStackAndSetFrame( threadReferenceProxy: ThreadReferenceProxyImpl, - stackFrameProvider: () -> XStackFrame?, + stackFrameProvider: (executionStack: JavaExecutionStack) -> XStackFrame?, isCurrentContext: Boolean = false ) { val stackFrameStack = debugProcess.invokeInManagerThread { - val stackFrame = stackFrameProvider.invoke() ?: return@invokeInManagerThread null - XStackFrameStack(stackFrame, createExecutionStack(threadReferenceProxy, isCurrentContext)) + val executionStack = createExecutionStack(threadReferenceProxy, isCurrentContext); + val stackFrame = stackFrameProvider.invoke(executionStack) ?: return@invokeInManagerThread null + XStackFrameStack(stackFrame, executionStack) } ?: return setCurrentStackFrame(stackFrameStack) } @@ -134,7 +131,7 @@ class XDebuggerTreeSelectedNodeListener(val session: XDebugSession, val tree: XD data class XStackFrameStack(val stackFrame: XStackFrame, val executionStack: XExecutionStack) - private fun createExecutionStack(proxy: ThreadReferenceProxyImpl, isCurrentContext: Boolean = false): XExecutionStack { + private fun createExecutionStack(proxy: ThreadReferenceProxyImpl, isCurrentContext: Boolean = false): JavaExecutionStack { val executionStack = JavaExecutionStack(proxy, debugProcess, isCurrentContext) executionStack.initTopFrame() return executionStack