From bf70fac365e0d95a08569fc1cba7585226e40b37 Mon Sep 17 00:00:00 2001 From: Maksim Zuev Date: Tue, 1 Oct 2024 10:14:00 +0200 Subject: [PATCH] [debugger, devkit] IDEA-355621 Search only for loaded class GitOrigin-RevId: 3034072eab48843f73c6907ec242b3608934e847 --- .../debugger/engine/DebugProcessImpl.java | 22 ++++++++++++------- .../debugger/DebugeeIdeStateRenderer.kt | 5 +++-- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java index 773533895589..a1248c99a927 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java @@ -1715,14 +1715,7 @@ public abstract class DebugProcessImpl extends UserDataHolderBase implements Deb ClassLoaderReference classLoader) throws EvaluateException { try { DebuggerManagerThreadImpl.assertIsManagerThread(); - ReferenceType result; - List 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 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() diff --git a/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/DebugeeIdeStateRenderer.kt b/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/DebugeeIdeStateRenderer.kt index 77b3249b6ff4..9cb72354c60b 100644 --- a/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/DebugeeIdeStateRenderer.kt +++ b/plugins/devkit/intellij.devkit.debugger/src/org/jetbrains/idea/devkit/debugger/DebugeeIdeStateRenderer.kt @@ -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()) as ObjectReference? + val state = debugProcess.invokeMethod(evaluationContext, supportClass as ClassType, getStateMethod, emptyList()) as ObjectReference? if (state == null) return val stateClass = state.referenceType()