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

Source
Inliners.scala
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 any2stringfmt
  3. by any2ArrowAssoc
  4. by any2Ensuring
  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]

    List of phase names, this phase should run after

    List of phase names, this phase should run after

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

    Phase name this phase will attach itself to, not allowing any phase to come between it and the phase name declared

    Phase name this phase will attach itself to, not allowing any phase to come between it and the phase name declared

    Definition Classes
    SubComponent

Concrete Value Members

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

    Definition Classes
    AnyRef
  2. final def !=(arg0: Any): Boolean

    Definition Classes
    Any
  3. final def ##(): Int

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

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

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

    Definition Classes
    AnyRef
  7. final def ==(arg0: Any): Boolean

    Definition Classes
    Any
  8. final val MAX_INLINE_RETRY: Int(15)

    Maximum loop iterations.

  9. final val MAX_INLINE_SIZE: Int(16)

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

  10. val SMALL_METHOD_SIZE: Int

    Small method size (in blocks)

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

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

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

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

    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws()
  15. 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 any2Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  16. def ensuring(cond: (Inliners) ⇒ Boolean): Inliners

    Implicit information
    This member is added by an implicit conversion from Inliners to Ensuring[Inliners] performed by method any2Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  17. 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 any2Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  18. def ensuring(cond: Boolean): Inliners

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

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

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

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

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

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

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

  26. 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
  27. val internal: Boolean

    Internal flag to tell external from internal phases

    Internal flag to tell external from internal phases

    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 runsBefore: List[String]

    List of phase names, this phase should run before

    List of phase names, this phase should run before

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

    Definition Classes
    AnyRef
  45. def toString(): String

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

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

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

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

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

Shadowed Implict Value Members

  1. val self: Any

    Implicit information
    This member is added by an implicit conversion from Inliners to StringAdd performed by method any2stringadd in scala.Predef.
    Shadowing
    This implicitly inherited member is ambiguous. One or more implicitly inherited members have similar signatures, so calling this member may produce an ambiguous implicit conversion compiler error.
    To access this member you can use a type ascription:
    (inliners: StringAdd).self
    Definition Classes
    StringAdd
  2. val self: Any

    Implicit information
    This member is added by an implicit conversion from Inliners to StringFormat performed by method any2stringfmt in scala.Predef.
    Shadowing
    This implicitly inherited member is ambiguous. One or more implicitly inherited members have similar signatures, so calling this member may produce an ambiguous implicit conversion compiler error.
    To access this member you can use a type ascription:
    (inliners: StringFormat).self
    Definition Classes
    StringFormat

Deprecated Value Members

  1. def x: Inliners

    Implicit information
    This member is added by an implicit conversion from Inliners to ArrowAssoc[Inliners] performed by method any2ArrowAssoc in scala.Predef.
    Shadowing
    This implicitly inherited member is ambiguous. One or more implicitly inherited members have similar signatures, so calling this member may produce an ambiguous implicit conversion compiler error.
    To access this member you can use a type ascription:
    (inliners: ArrowAssoc[Inliners]).x
    Definition Classes
    ArrowAssoc
    Annotations
    @deprecated
    Deprecated

    (Since version 2.10.0) Use leftOfArrow instead

  2. def x: Inliners

    Implicit information
    This member is added by an implicit conversion from Inliners to Ensuring[Inliners] performed by method any2Ensuring in scala.Predef.
    Shadowing
    This implicitly inherited member is ambiguous. One or more implicitly inherited members have similar signatures, so calling this member may produce an ambiguous implicit conversion compiler error.
    To access this member you can use a type ascription:
    (inliners: Ensuring[Inliners]).x
    Definition Classes
    Ensuring
    Annotations
    @deprecated
    Deprecated

    (Since version 2.10.0) Use resultOfEnsuring instead

Inherited from SubComponent

Inherited from AnyRef

Inherited from Any

Inherited by implicit conversion any2stringadd from Inliners to StringAdd

Inherited by implicit conversion any2stringfmt from Inliners to StringFormat

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

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

Ungrouped