summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-10-29 16:28:21 +0100
committerJason Zaugg <jzaugg@gmail.com>2013-11-08 08:20:45 +0100
commit4aeb8acf99493a5b3f7c2e012796ded77ae40a7f (patch)
treeb9f5f38420eb90aa225f520c6b52c770a99eef6a
parentb686a055a095af5da69d51e83fbf602f4db53b2f (diff)
downloadscala-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.)
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Implicits.scala10
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 }