Evaluate Expression: fix ClassNotFoundException for primitives and arrays
This commit is contained in:
@@ -89,6 +89,18 @@ class JDIEval(
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
val baseType = primitiveTypes[baseTypeName] ?: Type.getType("L$baseTypeName;").asReferenceType(classLoader)
|
||||
|
||||
return if (dimensions == 0)
|
||||
baseType
|
||||
else
|
||||
Type.getType("[".repeat(dimensions) + baseType.asType().descriptor).asReferenceType(classLoader)
|
||||
}
|
||||
|
||||
override fun loadString(str: String): Value = vm.mirrorOf(str).asValue()
|
||||
|
||||
override fun newInstance(classType: Type): Value {
|
||||
@@ -413,18 +425,7 @@ class JDIEval(
|
||||
return argumentTypes()
|
||||
}
|
||||
catch (e: ClassNotLoadedException) {
|
||||
return argumentTypeNames()!!.map {
|
||||
name ->
|
||||
val dimensions = name.count { it == '[' }
|
||||
val baseTypeName = if (dimensions > 0) name.substring(0, name.indexOf('[')) else name
|
||||
|
||||
val baseType = primitiveTypes[baseTypeName] ?: Type.getType("L$baseTypeName;").asReferenceType(declaringType().classLoader())
|
||||
|
||||
if (dimensions == 0)
|
||||
baseType
|
||||
else
|
||||
Type.getType("[".repeat(dimensions) + baseType.asType().descriptor).asReferenceType(declaringType().classLoader())
|
||||
}
|
||||
return argumentTypeNames()!!.map { name -> loadClassByName(name, declaringType().classLoader()) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -280,7 +280,7 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour
|
||||
.zip(argumentTypes)
|
||||
.map { (value, type) ->
|
||||
// Make argument type classes prepared for sure
|
||||
eval.loadClass(type, classLoader)
|
||||
eval.loadClassByName(type.className, classLoader)
|
||||
boxOrUnboxArgumentIfNeeded(eval, value, type).asJdiValue(vm, type)
|
||||
}
|
||||
|
||||
|
||||
Vendored
+3
@@ -14,3 +14,6 @@ fun foo(p: () -> Int) = p()
|
||||
// EXPRESSION: foo { a }
|
||||
// RESULT: 1: I
|
||||
|
||||
// EXPRESSION: foo { args.size }
|
||||
// RESULT: 0: I
|
||||
|
||||
|
||||
Vendored
+1
@@ -4,6 +4,7 @@ Connected to the target VM
|
||||
ceLambda.kt:6
|
||||
Compile bytecode for foo { 1 }
|
||||
Compile bytecode for foo { a }
|
||||
Compile bytecode for foo { args.size }
|
||||
Disconnected from the target VM
|
||||
|
||||
Process finished with exit code 0
|
||||
|
||||
Reference in New Issue
Block a user