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

scala.scalanative.optimizer.inject.HasTrait.scala Maven / Gradle / Ivy

The newest version!
package scala.scalanative
package optimizer
package inject

import scala.collection.mutable.Buffer
import analysis.ClassHierarchy.Top
import nir._

/** Injects scalanative_class_has_trait and
 *  scalanative_trait_has_trait intrinsics.
 */
class HasTrait(implicit top: Top, fresh: Fresh) extends Inject {
  import HasTrait._
  import top.tables

  def classHasTrait: Defn.Define = {
    val classid, traitid = Val.Local(fresh(), Type.Int)
    val boolptr          = Val.Local(fresh(), Type.Ptr)
    val result           = Val.Local(fresh(), Type.Bool)

    Defn.Define(
      Attrs(isExtern = true, inline = Attr.AlwaysInline),
      ClassHasTraitName,
      ClassHasTraitSig,
      Seq(
        Inst.Label(fresh(), Seq(classid, traitid)),
        Inst.Let(boolptr.name,
                 Op.Elem(tables.classHasTraitTy,
                         tables.classHasTraitVal,
                         Seq(Val.Int(0), classid, traitid))),
        Inst.Let(result.name, Op.Load(Type.Bool, boolptr)),
        Inst.Ret(result)
      )
    )
  }

  def traitHasTrait: Defn.Define = {
    val leftid, rightid = Val.Local(fresh(), Type.Int)
    val boolptr         = Val.Local(fresh(), Type.Ptr)
    val result          = Val.Local(fresh(), Type.Bool)

    Defn.Define(
      Attrs(isExtern = true, inline = Attr.AlwaysInline),
      TraitHasTraitName,
      TraitHasTraitSig,
      Seq(
        Inst.Label(fresh(), Seq(leftid, rightid)),
        Inst.Let(boolptr.name,
                 Op.Elem(tables.traitHasTraitTy,
                         tables.traitHasTraitVal,
                         Seq(Val.Int(0), leftid, rightid))),
        Inst.Let(result.name, Op.Load(Type.Bool, boolptr)),
        Inst.Ret(result)
      )
    )
  }

  override def apply(buf: Buffer[Defn]): Unit = {
    buf += classHasTrait
    buf += traitHasTrait
  }
}

object HasTrait extends InjectCompanion {
  val ClassHasTraitName =
    Global.Member(Global.Top("__extern"), "extern.__check_class_has_trait")
  val ClassHasTraitSig = Type.Function(Seq(Type.Int, Type.Int), Type.Bool)

  val TraitHasTraitName =
    Global.Member(Global.Top("__extern"), "extern.__check_trait_has_trait")
  val TraitHasTraitSig = Type.Function(Seq(Type.Int, Type.Int), Type.Bool)

  override def apply(config: tools.Config, top: Top) =
    new HasTrait()(top, top.fresh)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy