scala.tools.nsc.backend.opt

Inliners

abstract class Inliners extends SubComponent

Inliner balances two competing goals: (a) aggressive inlining of: (a.1) the apply methods of anonymous closures, so that their anon-classes can be eliminated; (a.2) higher-order-methods defined in an external library, e.g. Range.foreach() among many others. (b) circumventing the barrier to inter-library inlining that private accesses in the callee impose.

Summing up the discussion in SI-5442 and SI-5891, the current implementation achieves to a large degree both goals above, and overcomes a problem exhibited by previous versions:

(1) Problem: Attempting to access a private member p at runtime resulting in an IllegalAccessError, where p is defined in a library L, and is accessed from a library C (for Client), where C was compiled against L', an optimized version of L where the inliner made p public at the bytecode level. The only such members are fields, either synthetic or isParamAccessor, and thus having a dollar sign in their name (the accesibility of methods and constructors isn't touched by the inliner).

Thus we add one more goal to our list: (c) Compile C (either optimized or not) against any of L or L', so that it runs with either L or L' (in particular, compile against L' and run with L).

The chosen strategy is described in some detail in the comments for accessRequirements() and potentiallyPublicized(). Documentation at http://lamp.epfl.ch/~magarcia/ScalaCompilerCornerReloaded/2011Q4/Inliner.pdf

Linear Supertypes
Known Subclasses
Type Hierarchy Learn more about scaladoc diagrams
Ordering
  1. Alphabetic
  2. By inheritance
Inherited
  1. Inliners
  2. SubComponent
  3. AnyRef
  4. Any
Implicitly
  1. by any2stringadd
  2. by StringFormat
  3. by Ensuring
  4. by ArrowAssoc
  1. Hide All
  2. Show all
Learn more about member selection
Visibility
  1. Public
  2. All

Instance Constructors

  1. new Inliners()

Type Members

  1. class Inliner extends AnyRef

    Simple inliner.

  2. class InliningPhase extends Global.icodes.ICodePhase

    The Inlining phase.

  3. abstract class StdPhase extends GlobalPhase

    A standard phase template

Abstract Value Members

  1. abstract val global: Global

    The global environment; overridden by instantiation in Global.

    The global environment; overridden by instantiation in Global.

    Definition Classes
    SubComponent
  2. abstract val runsAfter: List[String]

    Names of phases that must run before this phase.

    Names of phases that must run before this phase.

    Definition Classes
    SubComponent
  3. abstract val runsRightAfter: Option[String]

    Name of the phase that this phase must follow immediately.

    Name of the phase that this phase must follow immediately.

    Definition Classes
    SubComponent

Concrete Value Members

  1. final def !=(arg0: Any): Boolean

    Definition Classes
    AnyRef → Any
  2. final def ##(): Int

    Definition Classes
    AnyRef → Any
  3. def +(other: String): String

    Implicit information
    This member is added by an implicit conversion from Inliners to any2stringadd[Inliners] performed by method any2stringadd in scala.Predef.
    Definition Classes
    any2stringadd
  4. def ->[B](y: B): (Inliners, B)

    Implicit information
    This member is added by an implicit conversion from Inliners to ArrowAssoc[Inliners] performed by method ArrowAssoc in scala.Predef.
    Definition Classes
    ArrowAssoc
    Annotations
    @inline()
  5. final def ==(arg0: Any): Boolean

    Definition Classes
    AnyRef → Any
  6. final val MAX_INLINE_RETRY: Int(15)

    Maximum loop iterations.

  7. final val MAX_INLINE_SIZE: Int(16)

    The maximum size in basic blocks of methods considered for inlining.

  8. val SMALL_METHOD_SIZE: Int

    Small method size (in blocks)

  9. final def afterOwnPhase[T](op: ⇒ T): T

    Definition Classes
    SubComponent
    Annotations
    @inline()
  10. final def asInstanceOf[T0]: T0

    Definition Classes
    Any
  11. final def beforeOwnPhase[T](op: ⇒ T): T

    Definition Classes
    SubComponent
    Annotations
    @inline()
  12. def clone(): AnyRef

    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  13. val enabled: Boolean

    Is this component enabled? Default is true.

    Is this component enabled? Default is true.

    Definition Classes
    InlinersSubComponent
  14. def ensuring(cond: (Inliners) ⇒ Boolean, msg: ⇒ Any): Inliners

    Implicit information
    This member is added by an implicit conversion from Inliners to Ensuring[Inliners] performed by method Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  15. def ensuring(cond: (Inliners) ⇒ Boolean): Inliners

    Implicit information
    This member is added by an implicit conversion from Inliners to Ensuring[Inliners] performed by method Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  16. def ensuring(cond: Boolean, msg: ⇒ Any): Inliners

    Implicit information
    This member is added by an implicit conversion from Inliners to Ensuring[Inliners] performed by method Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  17. def ensuring(cond: Boolean): Inliners

    Implicit information
    This member is added by an implicit conversion from Inliners to Ensuring[Inliners] performed by method Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  18. final def eq(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  19. def equals(arg0: Any): Boolean

    Definition Classes
    AnyRef → Any
  20. def finalize(): Unit

    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] )
  21. def formatted(fmtstr: String): String

    Implicit information
    This member is added by an implicit conversion from Inliners to StringFormat[Inliners] performed by method StringFormat in scala.Predef.
    Definition Classes
    StringFormat
    Annotations
    @inline()
  22. final def getClass(): Class[_]

    Definition Classes
    AnyRef → Any
  23. def hasInline(sym: Global.Symbol): Boolean

  24. def hasNoInline(sym: Global.Symbol): Boolean

  25. def hashCode(): Int

    SubComponent are added to a HashSet and two phases are the same if they have the same name

    SubComponent are added to a HashSet and two phases are the same if they have the same name

    Definition Classes
    SubComponent → AnyRef → Any
  26. val initial: Boolean

    True if this phase runs before all other phases.

    True if this phase runs before all other phases. Usually, parser.

    Definition Classes
    SubComponent
  27. val internal: Boolean

    True if this phase is not provided by a plug-in.

    True if this phase is not provided by a plug-in.

    Definition Classes
    SubComponent
  28. def isBottomType(sym: Global.Symbol): Boolean

  29. def isClosureClass(cls: Global.Symbol): Boolean

    Is the given class a closure?

  30. final def isInstanceOf[T0]: Boolean

    Definition Classes
    Any
  31. def isMonadicMethod(sym: Global.Symbol): Boolean

  32. val knownHasInline: Set[Global.Symbol]

  33. val knownLacksInline: Set[Global.Symbol]

  34. def lookupImplFor(sym: Global.Symbol, clazz: Global.Symbol): Global.Symbol

    Look up implementation of method 'sym in 'clazz'.

  35. final def ne(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  36. def newPhase(p: Phase): InliningPhase

    Create a new phase

    Create a new phase

    Definition Classes
    InlinersSubComponent
  37. final def notify(): Unit

    Definition Classes
    AnyRef
  38. final def notifyAll(): Unit

    Definition Classes
    AnyRef
  39. def ownPhase: Phase

    The phase corresponding to this subcomponent in the current compiler run

    The phase corresponding to this subcomponent in the current compiler run

    Definition Classes
    SubComponent
  40. val phaseName: String

    The name of the phase

    The name of the phase

    Definition Classes
    InlinersSubComponent
  41. def phaseNewFlags: Long

    New flags defined by the phase which are not valid before

    New flags defined by the phase which are not valid before

    Definition Classes
    SubComponent
  42. def phaseNextFlags: Long

    New flags defined by the phase which are not valid until immediately after it

    New flags defined by the phase which are not valid until immediately after it

    Definition Classes
    SubComponent
  43. val requires: List[String]

    Names of phases required by this component.

    Names of phases required by this component. Default is Nil.

    Definition Classes
    SubComponent
  44. val runsBefore: List[String]

    Names of phases that must run after this phase.

    Names of phases that must run after this phase. Default is Nil.

    Definition Classes
    SubComponent
  45. final def synchronized[T0](arg0: ⇒ T0): T0

    Definition Classes
    AnyRef
  46. val terminal: Boolean

    True if this phase runs after all other phases.

    True if this phase runs after all other phases. Usually, terminal.

    Definition Classes
    SubComponent
  47. def toString(): String

    Definition Classes
    AnyRef → Any
  48. final def wait(): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  49. final def wait(arg0: Long, arg1: Int): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  50. final def wait(arg0: Long): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  51. def [B](y: B): (Inliners, B)

    Implicit information
    This member is added by an implicit conversion from Inliners to ArrowAssoc[Inliners] performed by method ArrowAssoc in scala.Predef.
    Definition Classes
    ArrowAssoc

Inherited from SubComponent

Inherited from AnyRef

Inherited from Any

Inherited by implicit conversion any2stringadd from Inliners to any2stringadd[Inliners]

Inherited by implicit conversion StringFormat from Inliners to StringFormat[Inliners]

Inherited by implicit conversion Ensuring from Inliners to Ensuring[Inliners]

Inherited by implicit conversion ArrowAssoc from Inliners to ArrowAssoc[Inliners]

Ungrouped