All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ch.epfl.scala.debugadapter.internal.evaluator.JdiArray.scala Maven / Gradle / Ivy

package ch.epfl.scala.debugadapter.internal.evaluator

import com.sun.jdi.{ArrayReference, ThreadReference, Value}

import scala.jdk.CollectionConverters.*

object JdiArray {
  def apply(value: Value, thread: ThreadReference): JdiArray =
    new JdiArray(value.asInstanceOf[ArrayReference], thread)

  def apply(arrayType: String, arraySize: Int, classLoader: JdiClassLoader): Safe[JdiArray] = {
    val thread = classLoader.thread
    for {
      classClass <- classLoader.loadClass("java.lang.Class")
      intValue <- classLoader.mirrorOf("int")
      intClass <-
        classClass.invoke("getPrimitiveClass", List(intValue))
      arrayClass <- classLoader.loadClass("java.lang.reflect.Array")
      newInstanceValue <- classLoader.mirrorOf("newInstance")
      newInstanceMethod <- arrayClass
        .invoke("getMethod", List(newInstanceValue, classClass.reference, intClass))
        .map(JdiObject(_, thread))
      arrayTypeClass <- classLoader.loadClass(arrayType)
      integerRef <- JdiPrimitive.box(arraySize, classLoader, thread)
      array <- newInstanceMethod
        .invoke("invoke", List(null, arrayTypeClass.reference, integerRef))
        .map(JdiArray(_, thread))
    } yield array
  }
}

class JdiArray(reference: ArrayReference, thread: ThreadReference) extends JdiObject(reference, thread) {
  def setValue(index: Int, value: Value): Unit =
    reference.setValue(index, value)

  def setValues(values: Seq[Value]): Unit = reference.setValues(values.asJava)

  def getValues: Seq[Value] = reference.getValues.asScala.toSeq
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy