[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()