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 loadString(str: String): Value = vm.mirrorOf(str).asValue()
|
||||||
|
|
||||||
override fun newInstance(classType: Type): Value {
|
override fun newInstance(classType: Type): Value {
|
||||||
@@ -413,18 +425,7 @@ class JDIEval(
|
|||||||
return argumentTypes()
|
return argumentTypes()
|
||||||
}
|
}
|
||||||
catch (e: ClassNotLoadedException) {
|
catch (e: ClassNotLoadedException) {
|
||||||
return argumentTypeNames()!!.map {
|
return argumentTypeNames()!!.map { name -> loadClassByName(name, declaringType().classLoader()) }
|
||||||
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())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -280,7 +280,7 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour
|
|||||||
.zip(argumentTypes)
|
.zip(argumentTypes)
|
||||||
.map { (value, type) ->
|
.map { (value, type) ->
|
||||||
// Make argument type classes prepared for sure
|
// Make argument type classes prepared for sure
|
||||||
eval.loadClass(type, classLoader)
|
eval.loadClassByName(type.className, classLoader)
|
||||||
boxOrUnboxArgumentIfNeeded(eval, value, type).asJdiValue(vm, type)
|
boxOrUnboxArgumentIfNeeded(eval, value, type).asJdiValue(vm, type)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Vendored
+3
@@ -14,3 +14,6 @@ fun foo(p: () -> Int) = p()
|
|||||||
// EXPRESSION: foo { a }
|
// EXPRESSION: foo { a }
|
||||||
// RESULT: 1: I
|
// RESULT: 1: I
|
||||||
|
|
||||||
|
// EXPRESSION: foo { args.size }
|
||||||
|
// RESULT: 0: I
|
||||||
|
|
||||||
|
|||||||
Vendored
+1
@@ -4,6 +4,7 @@ Connected to the target VM
|
|||||||
ceLambda.kt:6
|
ceLambda.kt:6
|
||||||
Compile bytecode for foo { 1 }
|
Compile bytecode for foo { 1 }
|
||||||
Compile bytecode for foo { a }
|
Compile bytecode for foo { a }
|
||||||
|
Compile bytecode for foo { args.size }
|
||||||
Disconnected from the target VM
|
Disconnected from the target VM
|
||||||
|
|
||||||
Process finished with exit code 0
|
Process finished with exit code 0
|
||||||
|
|||||||
Reference in New Issue
Block a user