Skip to content

Commit ea17de1

Browse files
committed
Merge pull request scala#4341 from retronym/ticket/9157
SI-9157 Avoid exponential blowup with chained type projections
2 parents 3a3d0de + b6cbee9 commit ea17de1

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,6 @@ abstract class TreeCheckers extends Analyzer {
266266

267267
if (tree ne typed)
268268
treesDiffer(tree, typed)
269-
270269
tree
271270
}
272271

src/reflect/scala/reflect/internal/Types.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1976,13 +1976,13 @@ trait Types
19761976
* usage scenario.
19771977
*/
19781978
private var relativeInfoCache: Type = _
1979-
private var memberInfoCache: Type = _
1979+
private var relativeInfoPeriod: Period = NoPeriod
19801980

1981-
private[Types] def relativeInfo = {
1982-
val memberInfo = pre.memberInfo(sym)
1983-
if (relativeInfoCache == null || (memberInfo ne memberInfoCache)) {
1984-
memberInfoCache = memberInfo
1981+
private[Types] def relativeInfo = /*trace(s"relativeInfo(${safeToString}})")*/{
1982+
if (relativeInfoPeriod != currentPeriod) {
1983+
val memberInfo = pre.memberInfo(sym)
19851984
relativeInfoCache = transformInfo(memberInfo)
1985+
relativeInfoPeriod = currentPeriod
19861986
}
19871987
relativeInfoCache
19881988
}

test/files/pos/t9157.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
trait Flow[-In, +Out] {
2+
type Repr[+O] <: Flow[In, O]
3+
def map: Repr[String]
4+
}
5+
6+
class Test {
7+
// typechecking was exponentially slow wrt the number of projections here.
8+
def slowFlow(
9+
f: Flow[String,String]#Repr[String]#Repr[String]#Repr[String]#Repr[String]#Repr[String]#Repr[String]#Repr[String]#Repr[String]#Repr[String]#Repr[String]#Repr[String]
10+
) = {
11+
f.map
12+
}
13+
}

0 commit comments

Comments
 (0)