aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-11-09 15:38:37 +0100
committerMartin Odersky <odersky@gmail.com>2015-11-09 15:45:42 +0100
commit581960acfe3ff12e3e738ee5714f418d6baf90e7 (patch)
tree8ecc20f5238feca99b7f0afdfa10d8d837690b8f /src/dotty/tools/dotc/core
parentb23c6b8a626a99270c5495c9c55e214c55a5696b (diff)
downloaddotty-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
Diffstat (limited to 'src/dotty/tools/dotc/core')
-rw-r--r--src/dotty/tools/dotc/core/SymDenotations.scala2
-rw-r--r--src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala14
2 files changed, 10 insertions, 6 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)
}
}