Skip to content

Commit 5e6278e

Browse files
committed
Micro-optimization: Symbol#denot
1 parent a516a4e commit 5e6278e

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

compiler/src/dotty/tools/dotc/core/Denotations.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -668,8 +668,10 @@ object Denotations {
668668
private[this] var myValidFor: Period = Nowhere
669669

670670
def validFor = myValidFor
671-
def validFor_=(p: Period) =
671+
def validFor_=(p: Period) = {
672672
myValidFor = p
673+
symbol.invalidateDenotCache()
674+
}
673675

674676
/** The next SingleDenotation in this run, with wrap-around from last to first.
675677
*
@@ -774,7 +776,10 @@ object Denotations {
774776

775777
if (valid.runId != currentPeriod.runId)
776778
if (exists) initial.bringForward().current
777-
else this
779+
else {
780+
myValidFor = Period.allInRun(currentPeriod.runId)
781+
this
782+
}
778783
else {
779784
var cur = this
780785
if (currentPeriod.code > valid.code) {

compiler/src/dotty/tools/dotc/core/Symbols.scala

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -398,19 +398,36 @@ object Symbols {
398398

399399
/** The last denotation of this symbol */
400400
private[this] var lastDenot: SymDenotation = _
401+
private[this] var checkedPeriod: Period = Nowhere
402+
403+
private[core] def invalidateDenotCache() = { checkedPeriod = Nowhere }
401404

402405
/** Set the denotation of this symbol */
403-
private[core] def denot_=(d: SymDenotation) =
406+
private[core] def denot_=(d: SymDenotation) = {
404407
lastDenot = d
408+
checkedPeriod = Nowhere
409+
}
405410

406411
/** The current denotation of this symbol */
407412
final def denot(implicit ctx: Context): SymDenotation = {
408-
var denot = lastDenot
409-
if (!(denot.validFor contains ctx.period)) {
410-
denot = denot.current.asInstanceOf[SymDenotation]
411-
lastDenot = denot
412-
}
413-
denot
413+
val lastd = lastDenot
414+
if (checkedPeriod == ctx.period) lastd
415+
else computeDenot(lastd)
416+
}
417+
418+
private def computeDenot(lastd: SymDenotation)(implicit ctx: Context): SymDenotation = {
419+
val now = ctx.period
420+
if (lastd.validFor contains now) {
421+
checkedPeriod = now
422+
lastd
423+
} else recomputeDenot(lastd, now)
424+
}
425+
426+
private def recomputeDenot(lastd: SymDenotation, now: Period)(implicit ctx: Context): SymDenotation = {
427+
val newd = lastd.current.asInstanceOf[SymDenotation]
428+
lastDenot = newd
429+
checkedPeriod = now
430+
newd
414431
}
415432

416433
/** The initial denotation of this symbol, without going through `current` */
@@ -631,7 +648,6 @@ object Symbols {
631648

632649
@sharable object NoSymbol extends Symbol(NoCoord, 0) {
633650
denot = NoDenotation
634-
635651
override def associatedFile(implicit ctx: Context): AbstractFile = NoSource.file
636652
}
637653

0 commit comments

Comments
 (0)