diff options
author | Martin Odersky <odersky@gmail.com> | 2014-01-03 18:41:09 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-01-03 18:41:09 +0100 |
commit | ffb11f39dce0df32cedca3364727d6b56aa83014 (patch) | |
tree | 9e014b6431fba9f5615cd44679deee5e872ac8d1 /src/dotty/tools/dotc/core/SymDenotations.scala | |
parent | bbf09538e1248ea8907e34633ca5235c88533c97 (diff) | |
download | dotty-ffb11f39dce0df32cedca3364727d6b56aa83014.tar.gz dotty-ffb11f39dce0df32cedca3364727d6b56aa83014.tar.bz2 dotty-ffb11f39dce0df32cedca3364727d6b56aa83014.zip |
Avoid premature caching of baseClasses and superclass bits.
This can happen while classParents is set to Nil in Namer#classSig. Any call to baseClasses and superClassBits during that time needs to bypass the cache.
Diffstat (limited to 'src/dotty/tools/dotc/core/SymDenotations.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/SymDenotations.scala | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/src/dotty/tools/dotc/core/SymDenotations.scala b/src/dotty/tools/dotc/core/SymDenotations.scala index e9aeb286a..62262db93 100644 --- a/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/src/dotty/tools/dotc/core/SymDenotations.scala @@ -843,18 +843,22 @@ object SymDenotations { } /** A bitset that contains the superId's of all base classes */ - private def superClassBits(implicit ctx: Context): BitSet = { - if (mySuperClassBits == null) computeBases - mySuperClassBits - } + private def superClassBits(implicit ctx: Context): BitSet = + if (classParents.isEmpty) BitSet() // can happen when called too early in Namers + else { + if (mySuperClassBits == null) computeBases + mySuperClassBits + } /** The base classes of this class in linearization order, * with the class itself as first element. */ - def baseClasses(implicit ctx: Context): List[ClassSymbol] = { - if (myBaseClasses == null) computeBases - myBaseClasses - } + def baseClasses(implicit ctx: Context): List[ClassSymbol] = + if (classParents.isEmpty) classSymbol :: Nil // can happen when called too early in Namers + else { + if (myBaseClasses == null) computeBases + myBaseClasses + } final override def derivesFrom(base: Symbol)(implicit ctx: Context): Boolean = !isAbsent && |