diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2015-02-18 14:02:08 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2015-02-18 14:16:56 +1000 |
commit | b6cbee9d81320524aa2e8a3d80dbf2062dd43fd2 (patch) | |
tree | c20dab2c227285ff184a4a83e6d0e8ee37cf0983 /src/compiler | |
parent | da49d9a00ec373a0e7f2ffe946a897a65c9b0741 (diff) | |
download | scala-b6cbee9d81320524aa2e8a3d80dbf2062dd43fd2.tar.gz scala-b6cbee9d81320524aa2e8a3d80dbf2062dd43fd2.tar.bz2 scala-b6cbee9d81320524aa2e8a3d80dbf2062dd43fd2.zip |
SI-9157 Avoid exponential blowup with chained type projections
Calling `findMember` in the enclosed test was calling into
`NonClassTypeRef#relativeInfo` an exponentially-increasing number
of times, with respect to the length of the chained type projections.
The numbers of calls increased as: 26, 326, 3336, 33446, 334556.
Can any pattern spotters in the crowd that can identify the sequence?
(I can't.)
Tracing the calls saw we were computing the same `memberType`
repeatedly. This part of the method was not guarded by the cache.
I have changed the method to use the standard idiom of using the
current period for cache invalidation. The enclosed test now compiles
promptly, rather than in geological time.
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala b/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala index 743bbe53bd..02356580cc 100644 --- a/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/TreeCheckers.scala @@ -266,7 +266,6 @@ abstract class TreeCheckers extends Analyzer { if (tree ne typed) treesDiffer(tree, typed) - tree } |