Evaluate Expression: fix ClassNotFoundException for primitives and arrays

This commit is contained in:
Natalia Selezneva
2018-02-14 13:46:40 +03:00
parent 2f61bd41d5
commit 19e7002d02
4 changed files with 18 additions and 13 deletions
+13 -12
View File
@@ -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()) }
}
}
}
@@ -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)
}
@@ -14,3 +14,6 @@ fun foo(p: () -> Int) = p()
// EXPRESSION: foo { a }
// RESULT: 1: I
// EXPRESSION: foo { args.size }
// RESULT: 0: I
@@ -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