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, ObjectReference, ThreadReference, Value}

import scala.collection.JavaConverters._
import scala.util.Try

object JdiArray {
  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(_.asInstanceOf[ObjectReference])
          .map(new JdiObject(_, thread))
      arrayTypeClass <- classLoader.loadClass(arrayType)
      integerValue <- JdiPrimitive.boxed(arraySize, classLoader, thread)
      array <- newInstanceMethod
        .invoke(
          "invoke",
          List(null, arrayTypeClass.reference, integerValue.reference)
        )
        .map(_.asInstanceOf[ArrayReference])
        .map(new 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: List[Value]): Unit = reference.setValues(values.asJava)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy