Skip to content

Commit 581960a

Browse files
committed
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
1 parent b23c6b8 commit 581960a

File tree

3 files changed

+16
-7
lines changed

3 files changed

+16
-7
lines changed

src/dotty/tools/dotc/core/SymDenotations.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1883,5 +1883,5 @@ object SymDenotations {
18831883

18841884
private val AccessorOrLabel = Accessor | Label
18851885

1886-
private var indent = 0 // for completions printing
1886+
@sharable private var indent = 0 // for completions printing
18871887
}

src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,17 +99,21 @@ object Scala2Unpickler {
9999
case TempPolyType(tps, cinfo) => (tps, cinfo)
100100
case cinfo => (Nil, cinfo)
101101
}
102+
val ost =
103+
if ((selfInfo eq NoType) && (denot is ModuleClass))
104+
denot.owner.thisType select denot.sourceModule
105+
else selfInfo
106+
107+
denot.info = ClassInfo(denot.owner.thisType, denot.classSymbol, Nil, decls, ost) // first rough info to avoid CyclicReferences
102108
var parentRefs = ctx.normalizeToClassRefs(parents, cls, decls)
103109
if (parentRefs.isEmpty) parentRefs = defn.ObjectType :: Nil
104110
for (tparam <- tparams) {
105111
val tsym = decls.lookup(tparam.name)
106112
if (tsym.exists) tsym.setFlag(TypeParam)
107113
else denot.enter(tparam, decls)
108114
}
109-
val ost =
110-
if ((selfInfo eq NoType) && (denot is ModuleClass))
111-
denot.owner.thisType select denot.sourceModule
112-
else selfInfo
115+
denot.info = ClassInfo(
116+
denot.owner.thisType, denot.classSymbol, parentRefs, decls, ost) // more refined infowith parents
113117
if (!(denot.flagsUNSAFE is JavaModule)) ensureConstructor(denot.symbol.asClass, decls)
114118

115119
val scalacCompanion = denot.classSymbol.scalacLinkedClass
@@ -140,7 +144,7 @@ object Scala2Unpickler {
140144
decls1
141145
}
142146

143-
denot.info = ClassInfo(
147+
denot.info = ClassInfo( // final info
144148
denot.owner.thisType, denot.classSymbol, parentRefs, declsInRightOrder, ost)
145149
}
146150
}

test/dotc/scala-collections.whitelist

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
./scala-scala/src/library/scala/Product8.scala
6565
./scala-scala/src/library/scala/Product9.scala
6666

67-
6867
./scala-scala/src/library/scala/Proxy.scala
6968
./scala-scala/src/library/scala/SerialVersionUID.scala
7069
./scala-scala/src/library/scala/Serializable.scala
@@ -136,3 +135,9 @@
136135
./scala-scala/src/library/scala/transient.scala
137136
./scala-scala/src/library/scala/unchecked.scala
138137
./scala-scala/src/library/scala/volatile.scala
138+
139+
# cyclic reference
140+
./scala-scala/src/library/scala/collection/GenSeq.scala
141+
./scala-scala/src/library/scala/collection/GenSeqLike.scala
142+
143+

0 commit comments

Comments
 (0)