Skip to content

Commit 21fb6cb

Browse files
committed
New footprint calculation scheme
The old one clearly did not work. It either never worked or was disabled by the changes to matchtype reduction. I now changed it to a more straightforward scheme that computes the footprint directly instead of relying on TypeComparer to produce the right trace.
1 parent f15bbda commit 21fb6cb

File tree

1 file changed

+40
-4
lines changed

1 file changed

+40
-4
lines changed

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

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5003,6 +5003,8 @@ object Types extends TypeUtils {
50035003
case ex: Throwable =>
50045004
handleRecursive("normalizing", s"${scrutinee.show} match ..." , ex)
50055005

5006+
private def thisMatchType = this
5007+
50065008
def reduced(using Context): Type = {
50075009

50085010
def contextInfo(tp: Type): Type = tp match {
@@ -5021,12 +5023,44 @@ object Types extends TypeUtils {
50215023
reductionContext = util.HashMap()
50225024
for (tp <- footprint)
50235025
reductionContext(tp) = contextInfo(tp)
5024-
typr.println(i"footprint for $this $hashCode: ${footprint.toList.map(x => (x, contextInfo(x)))}%, %")
5026+
matchTypes.println(i"footprint for $this $hashCode: ${footprint.toList.map(x => (x, contextInfo(x)))}%, %")
50255027

50265028
def isUpToDate: Boolean =
5027-
reductionContext.keysIterator.forall { tp =>
5029+
reductionContext.keysIterator.forall: tp =>
50285030
reductionContext(tp) `eq` contextInfo(tp)
5029-
}
5031+
5032+
def computeFootprint(): Unit =
5033+
new TypeTraverser:
5034+
var footprint: Set[Type] = Set()
5035+
var deep: Boolean = true
5036+
val seen = util.HashSet[Type]()
5037+
def traverse(tp: Type) =
5038+
if !seen.contains(tp) then
5039+
seen += tp
5040+
tp match
5041+
case tp: NamedType =>
5042+
if tp.symbol.is(TypeParam) then footprint += tp
5043+
traverseChildren(tp)
5044+
case _: AppliedType | _: RefinedType =>
5045+
if deep then traverseChildren(tp)
5046+
case TypeBounds(lo, hi) =>
5047+
traverse(hi)
5048+
case tp: TypeVar =>
5049+
footprint += tp
5050+
traverse(tp.underlying)
5051+
case tp: TypeParamRef =>
5052+
footprint += tp
5053+
case _ =>
5054+
traverseChildren(tp)
5055+
end traverse
5056+
5057+
traverse(scrutinee)
5058+
deep = false
5059+
cases.foreach(traverse)
5060+
reductionContext = util.HashMap()
5061+
for tp <- footprint do
5062+
reductionContext(tp) = contextInfo(tp)
5063+
matchTypes.println(i"footprint for $thisMatchType $hashCode: ${footprint.toList.map(x => (x, contextInfo(x)))}%, %")
50305064

50315065
record("MatchType.reduce called")
50325066
if !Config.cacheMatchReduced
@@ -5038,19 +5072,21 @@ object Types extends TypeUtils {
50385072
if (myReduced != null) record("MatchType.reduce cache miss")
50395073
myReduced =
50405074
trace(i"reduce match type $this $hashCode", matchTypes, show = true)(inMode(Mode.Type) {
5075+
computeFootprint()
50415076
def matchCases(cmp: TrackingTypeComparer): Type =
50425077
val saved = ctx.typerState.snapshot()
50435078
try cmp.matchCases(scrutinee.normalized, cases.map(MatchTypeCaseSpec.analyze(_)))
50445079
catch case ex: Throwable =>
50455080
handleRecursive("reduce type ", i"$scrutinee match ...", ex)
50465081
finally
5047-
updateReductionContext(cmp.footprint)
5082+
//updateReductionContext(cmp.footprint)
50485083
ctx.typerState.resetTo(saved)
50495084
// this drops caseLambdas in constraint and undoes any typevar
50505085
// instantiations during matchtype reduction
50515086

50525087
TypeComparer.tracked(matchCases)
50535088
})
5089+
//else println(i"no change for $this $hashCode / $myReduced")
50545090
myReduced.nn
50555091
}
50565092

0 commit comments

Comments
 (0)