From 2fdadb0f5aee2ebb0e0a3c9540a046ca586da2d1 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 16 Feb 2018 16:37:34 +0300 Subject: [PATCH] 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. --- .../evaluate/classLoading/ClassLoadingAdapter.kt | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/classLoading/ClassLoadingAdapter.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/classLoading/ClassLoadingAdapter.kt index 075e9f09e15..08e6f7a435b 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/classLoading/ClassLoadingAdapter.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/evaluate/classLoading/ClassLoadingAdapter.kt @@ -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): 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 }