Evaluator: Send class bytecode array in loop with a limited chunk size (#KT-22967)

JDI in Android has a limited byte buffer size (8192), and we must not exceed it.
This commit is contained in:
Yan Zhulanow
2018-02-16 16:37:34 +03:00
parent dfc007ebd3
commit 2fdadb0f5a
@@ -28,12 +28,16 @@ import org.jetbrains.org.objectweb.asm.Label
import org.jetbrains.org.objectweb.asm.tree.ClassNode
import org.jetbrains.org.objectweb.asm.tree.JumpInsnNode
import org.jetbrains.org.objectweb.asm.tree.LabelNode
import kotlin.math.min
interface ClassLoadingAdapter {
companion object {
private const val CHUNK_SIZE = 4096
private val ADAPTERS = listOf(
AndroidOClassLoadingAdapter(),
OrdinaryClassLoadingAdapter())
AndroidOClassLoadingAdapter(),
OrdinaryClassLoadingAdapter()
)
fun loadClasses(context: EvaluationContextImpl, classes: Collection<ClassToLoad>): ClassLoaderReference? {
val hasAdditionalClasses = classes.size > 1
@@ -88,7 +92,13 @@ interface ClassLoadingAdapter {
for (byte in bytes) {
mirrors += process.virtualMachineProxy.mirrorOf(byte)
}
reference.values = mirrors
var loaded = 0
while (loaded < mirrors.size) {
val chunkSize = min(CHUNK_SIZE, mirrors.size - loaded)
reference.setValues(loaded, mirrors, loaded, chunkSize)
loaded += chunkSize
}
return reference
}