diff --git a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/proxy/mirror/coroutinesDebugMirror.kt b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/proxy/mirror/coroutinesDebugMirror.kt index 0b363cec50e..d8b95d4ba1d 100644 --- a/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/proxy/mirror/coroutinesDebugMirror.kt +++ b/idea/jvm-debugger/jvm-debugger-coroutine/src/org/jetbrains/kotlin/idea/debugger/coroutine/proxy/mirror/coroutinesDebugMirror.kt @@ -96,7 +96,7 @@ class DebugCoroutineInfoImpl constructor(context: DefaultExecutionContext) : private val javaLangMirror = JavaLangMirror(context) private val javaLangListMirror = JavaUtilAbstractCollection(context) private val stackTraceElement = StackTraceElement(context) - + private val weakReference = WeakReference(context) val lastObservedThread by FieldDelegate("lastObservedThread") val _context by MethodDelegate("getContext") @@ -117,6 +117,7 @@ class DebugCoroutineInfoImpl constructor(context: DefaultExecutionContext) : val creationStackTraceMirror = javaLangListMirror.mirror(getCreationStackTrace.value(value, context), context) val creationStackTrace = creationStackTraceMirror?.values?.mapNotNull { stackTraceElement.mirror(it, context) } + val lastObservedFrame = weakReference.mirror(_lastObservedFrame.value(value), context) return MirrorOfCoroutineInfo( value, coroutineContext, @@ -126,11 +127,22 @@ class DebugCoroutineInfoImpl constructor(context: DefaultExecutionContext) : creationStackTrace, state, lastObservedThread.value(value), - _lastObservedFrame.value(value) + lastObservedFrame?.reference ) } } +class WeakReference constructor(context: DefaultExecutionContext) : + BaseMirror("java.lang.ref.WeakReference", context) { + val get by MethodDelegate("get") + + override fun fetchMirror(value: ObjectReference, context: DefaultExecutionContext): MirrorOfWeakReference? { + return MirrorOfWeakReference(value, get.value(value, context)) + } +} + +data class MirrorOfWeakReference(val that: ObjectReference, val reference: ObjectReference?) + class CoroutineInfo private constructor( private val debugProbesImplMirror: DebugProbesImpl, context: DefaultExecutionContext,