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:
+13
-3
@@ -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.ClassNode
|
||||||
import org.jetbrains.org.objectweb.asm.tree.JumpInsnNode
|
import org.jetbrains.org.objectweb.asm.tree.JumpInsnNode
|
||||||
import org.jetbrains.org.objectweb.asm.tree.LabelNode
|
import org.jetbrains.org.objectweb.asm.tree.LabelNode
|
||||||
|
import kotlin.math.min
|
||||||
|
|
||||||
interface ClassLoadingAdapter {
|
interface ClassLoadingAdapter {
|
||||||
companion object {
|
companion object {
|
||||||
|
private const val CHUNK_SIZE = 4096
|
||||||
|
|
||||||
private val ADAPTERS = listOf(
|
private val ADAPTERS = listOf(
|
||||||
AndroidOClassLoadingAdapter(),
|
AndroidOClassLoadingAdapter(),
|
||||||
OrdinaryClassLoadingAdapter())
|
OrdinaryClassLoadingAdapter()
|
||||||
|
)
|
||||||
|
|
||||||
fun loadClasses(context: EvaluationContextImpl, classes: Collection<ClassToLoad>): ClassLoaderReference? {
|
fun loadClasses(context: EvaluationContextImpl, classes: Collection<ClassToLoad>): ClassLoaderReference? {
|
||||||
val hasAdditionalClasses = classes.size > 1
|
val hasAdditionalClasses = classes.size > 1
|
||||||
@@ -88,7 +92,13 @@ interface ClassLoadingAdapter {
|
|||||||
for (byte in bytes) {
|
for (byte in bytes) {
|
||||||
mirrors += process.virtualMachineProxy.mirrorOf(byte)
|
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
|
return reference
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user