mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-15 02:59:33 +07:00
[kotlin debugger] use more optimized jvm findClass
GitOrigin-RevId: d82d1d2e12239a2068b442cf5402acbcf43c6af0
This commit is contained in:
committed by
intellij-monorepo-bot
parent
906db74406
commit
e0d5283a4e
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user