[debugger, devkit] IDEA-355621 Search only for loaded class

GitOrigin-RevId: 3034072eab48843f73c6907ec242b3608934e847
This commit is contained in:
Maksim Zuev
2024-10-01 10:39:14 +00:00
committed by intellij-monorepo-bot
parent b4921470f5
commit bf70fac365
2 changed files with 17 additions and 10 deletions
@@ -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()
@@ -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()