diff options
Diffstat (limited to 'ir/src/main/scala/scala/scalajs/ir/Infos.scala')
-rw-r--r-- | ir/src/main/scala/scala/scalajs/ir/Infos.scala | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/ir/src/main/scala/scala/scalajs/ir/Infos.scala b/ir/src/main/scala/scala/scalajs/ir/Infos.scala new file mode 100644 index 0000000..66feec2 --- /dev/null +++ b/ir/src/main/scala/scala/scalajs/ir/Infos.scala @@ -0,0 +1,118 @@ +/* __ *\ +** ________ ___ / / ___ __ ____ Scala.js IR ** +** / __/ __// _ | / / / _ | __ / // __/ (c) 2014, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ |/_// /_\ \ http://scala-js.org/ ** +** /____/\___/_/ |_/____/_/ | |__/ /____/ ** +** |/____/ ** +\* */ + + +package scala.scalajs.ir + +object Infos { + + sealed class RoughClassInfo protected ( + val name: String, + val encodedName: String, + val isExported: Boolean, + val ancestorCount: Int + ) + + object RoughClassInfo { + def apply(name: String, encodedName: String, isExported: Boolean, + ancestorCount: Int): RoughClassInfo = { + new RoughClassInfo(name, encodedName, isExported, ancestorCount) + } + } + + final class ClassInfo protected ( + name: String, + encodedName: String, + isExported: Boolean, + ancestorCount: Int, + val kind: ClassKind, + val superClass: String, + val ancestors: List[String], // includes this class + val optimizerHints: OptimizerHints, + val methods: List[MethodInfo] + ) extends RoughClassInfo(name, encodedName, isExported, ancestorCount) + + object ClassInfo { + def apply( + name: String, + encodedName: String, + isExported: Boolean = false, + ancestorCount: Int = 0, + kind: ClassKind = ClassKind.Class, + superClass: String = "", + ancestors: List[String] = Nil, + optimizerHints: OptimizerHints = OptimizerHints.empty, + methods: List[MethodInfo] = Nil): ClassInfo = { + new ClassInfo(name, encodedName, isExported, ancestorCount, + kind, superClass, ancestors, optimizerHints, methods) + } + } + + final class MethodInfo private ( + val encodedName: String, + val isAbstract: Boolean, + val isExported: Boolean, + val calledMethods: Map[String, List[String]], + val calledMethodsStatic: Map[String, List[String]], + val instantiatedClasses: List[String], + val accessedModules: List[String], + val accessedClassData: List[String], + val optimizerHints: OptimizerHints + ) + + object MethodInfo { + def apply( + encodedName: String, + isAbstract: Boolean = false, + isExported: Boolean = false, + calledMethods: Map[String, List[String]] = Map.empty, + calledMethodsStatic: Map[String, List[String]] = Map.empty, + instantiatedClasses: List[String] = Nil, + accessedModules: List[String] = Nil, + accessedClassData: List[String] = Nil, + optimizerHints: OptimizerHints = OptimizerHints.empty): MethodInfo = { + new MethodInfo(encodedName, isAbstract, isExported, calledMethods, + calledMethodsStatic, instantiatedClasses, accessedModules, + accessedClassData, optimizerHints) + } + } + + final class OptimizerHints(val bits: Int) extends AnyVal { + import OptimizerHints._ + + private[scalajs] def isAccessor: Boolean = (bits & AccessorMask) != 0 + private[scalajs] def hasInlineAnnot: Boolean = (bits & InlineAnnotMask) != 0 + + private[scalajs] def copy( + isAccessor: Boolean = this.isAccessor, + hasInlineAnnot: Boolean = this.hasInlineAnnot + ): OptimizerHints = { + var bits: Int = 0 + if (isAccessor) + bits |= AccessorMask + if (hasInlineAnnot) + bits |= InlineAnnotMask + new OptimizerHints(bits) + } + + override def toString(): String = + s"OptimizerHints($bits)" + } + + object OptimizerHints { + private final val AccessorShift = 0 + private final val AccessorMask = 1 << AccessorShift + + private final val InlineAnnotShift = 1 + private final val InlineAnnotMask = 1 << InlineAnnotShift + + final val empty: OptimizerHints = + new OptimizerHints(0) + } + +} |