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

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

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

import com.sun.jdi._
import scala.collection.JavaConverters.*

private[internal] object JdiClassLoader {
  def fromFrame(frame: FrameReference): Safe[JdiClassLoader] = Safe {
    val scalaLibClassLoader =
      for {
        scalaLibClass <- frame.thread.virtualMachine.allClasses.asScala
          .find(c => c.name.startsWith("scala.runtime"))
        classLoader <- Option(scalaLibClass.classLoader)
      } yield classLoader

    val classLoader = Option(frame.current().location.method.declaringType.classLoader)
      .orElse(scalaLibClassLoader)
      .getOrElse(throw new Exception("Cannot find the classloader of the Scala library"))
    JdiClassLoader(classLoader, frame.thread)
  }

  def apply(
      classLoader: ClassLoaderReference,
      thread: ThreadReference
  ): JdiClassLoader = {
    val classLoaderType = classLoader.referenceType
    val loadClassMethod = method(
      "loadClass",
      "(Ljava/lang/String;)Ljava/lang/Class;",
      classLoaderType
    )
    new JdiClassLoader(classLoader, loadClassMethod, thread)
  }
}

private[internal] case class JdiClassLoader(
    classLoaderRef: ClassLoaderReference,
    loadClassMethod: Method,
    thread: ThreadReference
) {

  def loadClass(name: String): Safe[JdiClassObject] = {
    for {
      nameValue <- mirrorOf(name)
      classObject <- invokeMethod(
        classLoaderRef,
        loadClassMethod,
        List(nameValue),
        thread
      )
    } yield {
      new JdiClassObject(
        classObject.asInstanceOf[ClassObjectReference],
        this,
        thread
      )
    }
  }

  def mirrorOf(str: String): Safe[StringReference] = {
    Safe(thread.virtualMachine.mirrorOf(str))
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy