(CoroutineDebugger) using WeakReference as lastObservedFrame
relates to #KT-40073
This commit is contained in:
+14
-2
@@ -96,7 +96,7 @@ class DebugCoroutineInfoImpl constructor(context: DefaultExecutionContext) :
|
|||||||
private val javaLangMirror = JavaLangMirror(context)
|
private val javaLangMirror = JavaLangMirror(context)
|
||||||
private val javaLangListMirror = JavaUtilAbstractCollection(context)
|
private val javaLangListMirror = JavaUtilAbstractCollection(context)
|
||||||
private val stackTraceElement = StackTraceElement(context)
|
private val stackTraceElement = StackTraceElement(context)
|
||||||
|
private val weakReference = WeakReference(context)
|
||||||
|
|
||||||
val lastObservedThread by FieldDelegate<ThreadReference>("lastObservedThread")
|
val lastObservedThread by FieldDelegate<ThreadReference>("lastObservedThread")
|
||||||
val _context by MethodDelegate<ObjectReference>("getContext")
|
val _context by MethodDelegate<ObjectReference>("getContext")
|
||||||
@@ -117,6 +117,7 @@ class DebugCoroutineInfoImpl constructor(context: DefaultExecutionContext) :
|
|||||||
val creationStackTraceMirror = javaLangListMirror.mirror(getCreationStackTrace.value(value, context), context)
|
val creationStackTraceMirror = javaLangListMirror.mirror(getCreationStackTrace.value(value, context), context)
|
||||||
val creationStackTrace = creationStackTraceMirror?.values?.mapNotNull { stackTraceElement.mirror(it, context) }
|
val creationStackTrace = creationStackTraceMirror?.values?.mapNotNull { stackTraceElement.mirror(it, context) }
|
||||||
|
|
||||||
|
val lastObservedFrame = weakReference.mirror(_lastObservedFrame.value(value), context)
|
||||||
return MirrorOfCoroutineInfo(
|
return MirrorOfCoroutineInfo(
|
||||||
value,
|
value,
|
||||||
coroutineContext,
|
coroutineContext,
|
||||||
@@ -126,11 +127,22 @@ class DebugCoroutineInfoImpl constructor(context: DefaultExecutionContext) :
|
|||||||
creationStackTrace,
|
creationStackTrace,
|
||||||
state,
|
state,
|
||||||
lastObservedThread.value(value),
|
lastObservedThread.value(value),
|
||||||
_lastObservedFrame.value(value)
|
lastObservedFrame?.reference
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class WeakReference constructor(context: DefaultExecutionContext) :
|
||||||
|
BaseMirror<MirrorOfWeakReference>("java.lang.ref.WeakReference", context) {
|
||||||
|
val get by MethodDelegate<ObjectReference>("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(
|
class CoroutineInfo private constructor(
|
||||||
private val debugProbesImplMirror: DebugProbesImpl,
|
private val debugProbesImplMirror: DebugProbesImpl,
|
||||||
context: DefaultExecutionContext,
|
context: DefaultExecutionContext,
|
||||||
|
|||||||
Reference in New Issue
Block a user