Skip to content

Commit 5c49daf

Browse files
liufengyunmichelou
authored andcommitted
Code refactor of initialization check (scala#12055)
1 parent 511b2e2 commit 5c49daf

File tree

3 files changed

+48
-31
lines changed

3 files changed

+48
-31
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package dotty.tools.dotc
2+
package transform
3+
package init
4+
5+
import core._
6+
import Contexts._
7+
import Types._
8+
import Symbols._
9+
import Decorators._
10+
11+
import ast.Trees._
12+
import ast.tpd
13+
14+
import reporting.trace
15+
import config.Printers.init
16+
17+
import scala.collection.mutable
18+
19+
import Effects._, Potentials._, Summary._
20+
21+
class Cache {
22+
/** Summary of a class */
23+
private val summaryCache = mutable.Map.empty[ClassSymbol, ClassSummary]
24+
def summaryOf(cls: ClassSymbol)(using Env): ClassSummary =
25+
if (summaryCache.contains(cls)) summaryCache(cls)
26+
else trace("summary for " + cls.show, init, s => s.asInstanceOf[ClassSummary].show) {
27+
val summary = Summarization.classSummary(cls)
28+
summaryCache(cls) = summary
29+
summary
30+
}
31+
32+
/** Cache for outer this */
33+
private case class OuterKey(warm: Warm, cls: ClassSymbol)
34+
private val outerCache: mutable.Map[OuterKey, Potentials] = mutable.Map.empty
35+
def resolveOuter(warm: Warm, cls: ClassSymbol)(using Env): Potentials =
36+
val key = OuterKey(warm, cls)
37+
if (outerCache.contains(key)) outerCache(key)
38+
else {
39+
val pots = Potentials.resolveOuter(warm.classSymbol, warm.outer.toPots, cls)
40+
outerCache(key) = pots
41+
pots
42+
}
43+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class Checker extends MiniPhase {
2424
val phaseName = "initChecker"
2525

2626
// cache of class summary
27-
private val baseEnv = Env(null)
27+
private val cache = new Cache
2828

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

@@ -54,7 +54,7 @@ class Checker extends MiniPhase {
5454
fieldsInited = mutable.Set.empty,
5555
parentsInited = mutable.Set.empty,
5656
safePromoted = mutable.Set.empty,
57-
env = baseEnv.withCtx(ctx.withOwner(cls))
57+
env = Env(ctx.withOwner(cls), cache)
5858
)
5959

6060
Checking.checkClassBody(tree)

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

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,11 @@ import Types._
88
import Symbols._
99
import Decorators._
1010

11-
import ast.Trees._
12-
import ast.tpd
13-
14-
import reporting.trace
15-
import config.Printers.init
16-
17-
import scala.collection.mutable
18-
1911
import Effects._, Potentials._, Summary._
2012

2113
given theCtx(using Env): Context = summon[Env].ctx
2214

23-
case class Env(ctx: Context) {
15+
case class Env(ctx: Context, cache: Cache) {
2416
private implicit def self: Env = this
2517

2618
/** Can the method call be ignored? */
@@ -46,25 +38,7 @@ case class Env(ctx: Context) {
4638
sym.isPrimitiveValueClass || sym == defn.StringClass
4739
}
4840

49-
/** Summary of a class */
50-
private val summaryCache = mutable.Map.empty[ClassSymbol, ClassSummary]
51-
def summaryOf(cls: ClassSymbol): ClassSummary =
52-
if (summaryCache.contains(cls)) summaryCache(cls)
53-
else trace("summary for " + cls.show, init, s => s.asInstanceOf[ClassSummary].show) {
54-
val summary = Summarization.classSummary(cls)
55-
summaryCache(cls) = summary
56-
summary
57-
}
41+
def summaryOf(cls: ClassSymbol): ClassSummary = cache.summaryOf(cls)
5842

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-
}
43+
def resolveOuter(warm: Warm, cls: ClassSymbol): Potentials = cache.resolveOuter(warm, cls)
7044
}

0 commit comments

Comments
 (0)