diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-10-29 16:28:21 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-11-08 08:20:45 +0100 |
commit | 4aeb8acf99493a5b3f7c2e012796ded77ae40a7f (patch) | |
tree | b9f5f38420eb90aa225f520c6b52c770a99eef6a /src/compiler/scala/tools/nsc/typechecker/Implicits.scala | |
parent | b686a055a095af5da69d51e83fbf602f4db53b2f (diff) | |
download | scala-4aeb8acf99493a5b3f7c2e012796ded77ae40a7f.tar.gz scala-4aeb8acf99493a5b3f7c2e012796ded77ae40a7f.tar.bz2 scala-4aeb8acf99493a5b3f7c2e012796ded77ae40a7f.zip |
Cache ImplicitInfo#isCyclicOrErroneous
An optimization in implicit search.
ImplicitInfo-s themselves are cached (per-run) in Contexts
(for in-scope implicits) and in Implicits (for companion object
implicits.)
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Implicits.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Implicits.scala | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala index 5546e56c0d..8a3bba7d0f 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala @@ -17,7 +17,7 @@ import scala.collection.{ mutable, immutable } import mutable.{ LinkedHashMap, ListBuffer } import scala.util.matching.Regex import symtab.Flags._ -import scala.reflect.internal.util.Statistics +import scala.reflect.internal.util.{TriState, Statistics} import scala.language.implicitConversions /** This trait provides methods to find various kinds of implicits. @@ -198,6 +198,7 @@ trait Implicits { */ class ImplicitInfo(val name: Name, val pre: Type, val sym: Symbol) { private var tpeCache: Type = null + private var isCyclicOrErroneousCache: TriState = TriState.Unknown /** Computes member type of implicit from prefix `pre` (cached). */ def tpe: Type = { @@ -205,7 +206,12 @@ trait Implicits { tpeCache } - def isCyclicOrErroneous = + def isCyclicOrErroneous: Boolean = { + if (!isCyclicOrErroneousCache.isKnown) isCyclicOrErroneousCache = computeIsCyclicOrErroneous + isCyclicOrErroneousCache.booleanValue + } + + private[this] final def computeIsCyclicOrErroneous = try sym.hasFlag(LOCKED) || containsError(tpe) catch { case _: CyclicReference => true } |