diff options
author | Martin Odersky <odersky@gmail.com> | 2015-11-09 15:38:37 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-11-09 15:45:42 +0100 |
commit | 581960acfe3ff12e3e738ee5714f418d6baf90e7 (patch) | |
tree | 8ecc20f5238feca99b7f0afdfa10d8d837690b8f | |
parent | b23c6b8a626a99270c5495c9c55e214c55a5696b (diff) | |
download | dotty-581960acfe3ff12e3e738ee5714f418d6baf90e7.tar.gz dotty-581960acfe3ff12e3e738ee5714f418d6baf90e7.tar.bz2 dotty-581960acfe3ff12e3e738ee5714f418d6baf90e7.zip |
Avoid cyclic reference errors when unpickling classes
Set info early in order to avoid cyclic reference errors.
Errors were observed when compiling
scala/Predef.scala scala/package.scala scala/collection/GenSeqLike.scala
-rw-r--r-- | src/dotty/tools/dotc/core/SymDenotations.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala | 14 | ||||
-rw-r--r-- | test/dotc/scala-collections.whitelist | 7 |
3 files changed, 16 insertions, 7 deletions
diff --git a/src/dotty/tools/dotc/core/SymDenotations.scala b/src/dotty/tools/dotc/core/SymDenotations.scala index feb0c22df..5d079640f 100644 --- a/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/src/dotty/tools/dotc/core/SymDenotations.scala @@ -1883,5 +1883,5 @@ object SymDenotations { private val AccessorOrLabel = Accessor | Label - private var indent = 0 // for completions printing + @sharable private var indent = 0 // for completions printing } diff --git a/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala b/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala index f42169029..b5d81d02e 100644 --- a/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala +++ b/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala @@ -99,6 +99,12 @@ object Scala2Unpickler { case TempPolyType(tps, cinfo) => (tps, cinfo) case cinfo => (Nil, cinfo) } + val ost = + if ((selfInfo eq NoType) && (denot is ModuleClass)) + denot.owner.thisType select denot.sourceModule + else selfInfo + + denot.info = ClassInfo(denot.owner.thisType, denot.classSymbol, Nil, decls, ost) // first rough info to avoid CyclicReferences var parentRefs = ctx.normalizeToClassRefs(parents, cls, decls) if (parentRefs.isEmpty) parentRefs = defn.ObjectType :: Nil for (tparam <- tparams) { @@ -106,10 +112,8 @@ object Scala2Unpickler { if (tsym.exists) tsym.setFlag(TypeParam) else denot.enter(tparam, decls) } - val ost = - if ((selfInfo eq NoType) && (denot is ModuleClass)) - denot.owner.thisType select denot.sourceModule - else selfInfo + denot.info = ClassInfo( + denot.owner.thisType, denot.classSymbol, parentRefs, decls, ost) // more refined infowith parents if (!(denot.flagsUNSAFE is JavaModule)) ensureConstructor(denot.symbol.asClass, decls) val scalacCompanion = denot.classSymbol.scalacLinkedClass @@ -140,7 +144,7 @@ object Scala2Unpickler { decls1 } - denot.info = ClassInfo( + denot.info = ClassInfo( // final info denot.owner.thisType, denot.classSymbol, parentRefs, declsInRightOrder, ost) } } diff --git a/test/dotc/scala-collections.whitelist b/test/dotc/scala-collections.whitelist index 818287fb5..59388ac78 100644 --- a/test/dotc/scala-collections.whitelist +++ b/test/dotc/scala-collections.whitelist @@ -64,7 +64,6 @@ ./scala-scala/src/library/scala/Product8.scala ./scala-scala/src/library/scala/Product9.scala - ./scala-scala/src/library/scala/Proxy.scala ./scala-scala/src/library/scala/SerialVersionUID.scala ./scala-scala/src/library/scala/Serializable.scala @@ -136,3 +135,9 @@ ./scala-scala/src/library/scala/transient.scala ./scala-scala/src/library/scala/unchecked.scala ./scala-scala/src/library/scala/volatile.scala + +# cyclic reference +./scala-scala/src/library/scala/collection/GenSeq.scala +./scala-scala/src/library/scala/collection/GenSeqLike.scala + + |