mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[debugger, devkit] IDEA-355621 Search only for loaded class
GitOrigin-RevId: 3034072eab48843f73c6907ec242b3608934e847
This commit is contained in:
committed by
intellij-monorepo-bot
parent
b4921470f5
commit
bf70fac365
@@ -1715,14 +1715,7 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb
|
||||
ClassLoaderReference classLoader) throws EvaluateException {
|
||||
try {
|
||||
DebuggerManagerThreadImpl.assertIsManagerThread();
|
||||
ReferenceType result;
|
||||
List<ReferenceType> types = ContainerUtil.filter(getCurrentVm(evaluationContext).classesByName(className), ReferenceType::isPrepared);
|
||||
// first try to quickly find the equal classloader only
|
||||
result = ContainerUtil.find(types, refType -> Objects.equals(classLoader, refType.classLoader()));
|
||||
// now do the full visibility check
|
||||
if (result == null && classLoader != null) {
|
||||
result = ContainerUtil.find(types, refType -> isVisibleFromClassLoader(classLoader, refType));
|
||||
}
|
||||
ReferenceType result = findLoadedClass(evaluationContext, className, classLoader);
|
||||
if (result == null && evaluationContext != null) {
|
||||
EvaluationContextImpl evalContext = (EvaluationContextImpl)evaluationContext;
|
||||
if (evalContext.isAutoLoadClasses()) {
|
||||
@@ -1736,6 +1729,19 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb
|
||||
}
|
||||
}
|
||||
|
||||
public @Nullable ReferenceType findLoadedClass(@Nullable EvaluationContext evaluationContext,
|
||||
String className,
|
||||
ClassLoaderReference classLoader) {
|
||||
List<ReferenceType> types = ContainerUtil.filter(getCurrentVm(evaluationContext).classesByName(className), ReferenceType::isPrepared);
|
||||
// first try to quickly find the equal classloader only
|
||||
ReferenceType result = ContainerUtil.find(types, refType -> Objects.equals(classLoader, refType.classLoader()));
|
||||
// now do the full visibility check
|
||||
if (result == null && classLoader != null) {
|
||||
result = ContainerUtil.find(types, refType -> isVisibleFromClassLoader(classLoader, refType));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private VirtualMachineProxyImpl getCurrentVm(@Nullable EvaluationContext evaluationContext) {
|
||||
return evaluationContext != null
|
||||
? ((SuspendContextImpl)evaluationContext.getSuspendContext()).getVirtualMachineProxy()
|
||||
|
||||
+3
-2
@@ -37,14 +37,15 @@ private const val THREADING_SUPPORT_FQN = "com.intellij.openapi.application.impl
|
||||
internal class DebugeeIdeStateRenderer : ExtraDebugNodesProvider {
|
||||
override fun addExtraNodes(evaluationContext: EvaluationContext, children: XValueChildrenList) {
|
||||
if (!Registry.`is`("devkit.debugger.show.ide.state")) return
|
||||
val debugProcess = evaluationContext.debugProcess as? DebugProcessImpl ?: return
|
||||
val supportClass = try {
|
||||
evaluationContext.debugProcess.findClass(evaluationContext, SUPPORT_CLASS_FQN, null) ?: return
|
||||
debugProcess.findLoadedClass(evaluationContext, SUPPORT_CLASS_FQN, evaluationContext.classLoader) ?: return
|
||||
}
|
||||
catch (_: EvaluateException) {
|
||||
return
|
||||
}
|
||||
val getStateMethod = DebuggerUtils.findMethod(supportClass, GET_STATE_METHOD_NAME, GET_STATE_METHOD_SIGNATURE) ?: return
|
||||
val state = evaluationContext.debugProcess.invokeMethod(evaluationContext, supportClass as ClassType, getStateMethod, emptyList<Value>()) as ObjectReference?
|
||||
val state = debugProcess.invokeMethod(evaluationContext, supportClass as ClassType, getStateMethod, emptyList<Value>()) as ObjectReference?
|
||||
if (state == null) return
|
||||
val stateClass = state.referenceType()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user