Skip to content

Commit 4fc93aa

Browse files
committed
Refine outer cache
1 parent 0bbf779 commit 4fc93aa

File tree

3 files changed

+18
-14
lines changed

3 files changed

+18
-14
lines changed

compiler/src/dotty/tools/dotc/transform/init/Checker.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class Checker extends MiniPhase {
2323
val phaseName = "initChecker"
2424

2525
// cache of class summary
26-
private val baseEnv = Env(null, mutable.Map.empty)
26+
private val baseEnv = Env(null)
2727

2828
override val runsAfter = Set(Pickler.name)
2929

compiler/src/dotty/tools/dotc/transform/init/Env.scala

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import Effects._, Potentials._, Summary._
2020

2121
implicit def theCtx(implicit env: Env): Context = env.ctx
2222

23-
case class Env(ctx: Context, summaryCache: mutable.Map[ClassSymbol, ClassSummary]) {
23+
case class Env(ctx: Context) {
2424
private implicit def self: Env = this
2525

2626
// Methods that should be ignored in the checking
@@ -46,12 +46,25 @@ case class Env(ctx: Context, summaryCache: mutable.Map[ClassSymbol, ClassSummary
4646
sym.isPrimitiveValueClass || sym == defn.StringClass
4747
}
4848

49-
/** Summary of a method or field */
49+
/** Summary of a class */
50+
private val summaryCache = mutable.Map.empty[ClassSymbol, ClassSummary]
5051
def summaryOf(cls: ClassSymbol): ClassSummary =
5152
if (summaryCache.contains(cls)) summaryCache(cls)
5253
else trace("summary for " + cls.show, init, s => s.asInstanceOf[ClassSummary].show) {
5354
val summary = Summarization.classSummary(cls)
5455
summaryCache(cls) = summary
5556
summary
5657
}
58+
59+
/** Cache for outer this */
60+
private case class OuterKey(warm: Warm, cls: ClassSymbol)
61+
private val outerCache: mutable.Map[OuterKey, Potentials] = mutable.Map.empty
62+
def resolveOuter(warm: Warm, cls: ClassSymbol)(implicit env: Env): Potentials =
63+
val key = OuterKey(warm, cls)
64+
if (outerCache.contains(key)) outerCache(key)
65+
else {
66+
val pots = Potentials.resolveOuter(warm.classSymbol, warm.outer.toPots, cls)
67+
outerCache(key) = pots
68+
pots
69+
}
5770
}

compiler/src/dotty/tools/dotc/transform/init/Potentials.scala

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ object Potentials {
7070
def effectsOf(sym: Symbol)(implicit env: Env): Effects = trace("effects of " + sym.show, init, r => Effects.show(r.asInstanceOf)) {
7171
val cls = sym.owner.asClass
7272
val effs = env.summaryOf(cls).effectsOf(sym)
73-
val outer = Outer(this, cls)(this.source)
7473
Effects.asSeenFrom(effs, this)
7574
}
7675

@@ -81,22 +80,14 @@ object Potentials {
8180
def potentialsOf(sym: Symbol)(implicit env: Env): Potentials = trace("potentials of " + sym.show, init, r => Potentials.show(r.asInstanceOf)) {
8281
val cls = sym.owner.asClass
8382
val pots = env.summaryOf(cls).potentialsOf(sym)
84-
val outer = Outer(this, cls)(this.source)
8583
Potentials.asSeenFrom(pots, this)
8684
}
8785

88-
private val outerCache: mutable.Map[ClassSymbol, Potentials] = mutable.Map.empty
8986
def resolveOuter(cls: ClassSymbol)(implicit env: Env): Potentials =
90-
if (outerCache.contains(cls)) outerCache(cls)
91-
else if (cls `eq` classSymbol) outer.toPots
92-
else {
93-
val pots = Potentials.resolveOuter(classSymbol, outer.toPots, cls)
94-
outerCache(cls) = pots
95-
pots
96-
}
87+
env.resolveOuter(this, cls)
9788
}
9889

99-
private def resolveOuter(cur: ClassSymbol, outerPots: Potentials, cls: ClassSymbol)(implicit env: Env): Potentials =
90+
def resolveOuter(cur: ClassSymbol, outerPots: Potentials, cls: ClassSymbol)(implicit env: Env): Potentials =
10091
if (cur == cls) outerPots
10192
else {
10293
val bottomClsSummary = env.summaryOf(cur)

0 commit comments

Comments
 (0)