[kotlin debugger] use more optimized jvm findClass

GitOrigin-RevId: d82d1d2e12239a2068b442cf5402acbcf43c6af0
This commit is contained in:
Egor Ushakov
2024-09-05 16:42:03 +02:00
committed by intellij-monorepo-bot
parent 906db74406
commit e0d5283a4e
2 changed files with 11 additions and 6 deletions

View File

@@ -36,15 +36,15 @@ open class JDIEval(
private val isJava8OrLater = StringUtil.compareVersionNumbers(vm.version(), "1.8") >= 0
override fun loadClass(classType: Type): Value {
return loadClass(classType, defaultClassLoader)
return loadType(classType, defaultClassLoader).classObject().asValue()
}
private fun loadClass(classType: Type, classLoader: ClassLoaderReference?): Value {
open fun loadType(classType: Type, classLoader: ClassLoaderReference?): ReferenceType {
val loadedClasses = vm.classesByName(classType.className)
if (loadedClasses.isNotEmpty()) {
for (loadedClass in loadedClasses) {
if (loadedClass.isPrepared && (classType.descriptor in BOOTSTRAP_CLASS_DESCRIPTORS || loadedClass.classLoader() == classLoader)) {
return loadedClass.classObject().asValue()
return loadedClass
}
}
}
@@ -57,7 +57,7 @@ open class JDIEval(
true
),
listOf(loadString(classType.jdiName))
)
).jdiClass!!.reflectedType()
} else {
return invokeStaticMethod(
MethodDescription(
@@ -71,10 +71,11 @@ open class JDIEval(
boolean(true),
classLoader.asValue()
)
)
).jdiClass!!.reflectedType()
}
}
private fun loadClassByName(name: String, classLoader: ClassLoaderReference): jdi_Type {
val dimensions = name.count { it == '[' }
val baseTypeName = if (dimensions > 0) name.substring(0, name.indexOf('[')) else name
@@ -114,7 +115,7 @@ open class JDIEval(
}
private fun Type.asReferenceType(classLoader: ClassLoaderReference? = this@JDIEval.defaultClassLoader): ReferenceType =
loadClass(this, classLoader).jdiClass!!.reflectedType()
loadType(this, classLoader)
private fun Type.asArrayType(classLoader: ClassLoaderReference? = this@JDIEval.defaultClassLoader): ArrayType =
asReferenceType(classLoader) as ArrayType

View File

@@ -275,6 +275,10 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, private val sourcePositi
return super.isInstanceOf(value, targetType)
}
}
override fun loadType(classType: Type, classLoader: ClassLoaderReference?): ReferenceType {
return context.debugProcess.findClass(context.evaluationContext, classType.className, classLoader)
}
}
interpreterLoop(mainMethod, makeInitialFrame(mainMethod, args.map { it.asValue() }), eval)
}