File tree 1 file changed +13
-2
lines changed
compiler/src/dotty/tools/dotc/core/tasty 1 file changed +13
-2
lines changed Original file line number Diff line number Diff line change @@ -631,8 +631,16 @@ class TreeUnpickler(reader: TastyReader,
631
631
* or else read definition.
632
632
*/
633
633
def readIndexedDef ()(implicit ctx : Context ): Tree = treeAtAddr.remove(currentAddr) match {
634
- case Some (tree) => skipTree(); tree
635
- case none => readNewDef()
634
+ case Some (tree) =>
635
+ assert(tree != PoisonTree , s " Cyclic reference while unpickling definition at address ${currentAddr.index} in unit ${ctx.compilationUnit}" )
636
+ skipTree()
637
+ tree
638
+ case none =>
639
+ val start = currentAddr
640
+ treeAtAddr(start) = PoisonTree
641
+ val tree = readNewDef()
642
+ treeAtAddr.remove(start)
643
+ tree
636
644
}
637
645
638
646
private def readNewDef ()(implicit ctx : Context ): Tree = {
@@ -1169,6 +1177,9 @@ class TreeUnpickler(reader: TastyReader,
1169
1177
1170
1178
object TreeUnpickler {
1171
1179
1180
+ /** A marker value used to detect cyclic reference while unpickling definitions. */
1181
+ @ sharable val PoisonTree : tpd.Tree = Thicket (Nil )
1182
+
1172
1183
/** An enumeration indicating which subtrees should be added to an OwnerTree. */
1173
1184
type MemberDefMode = Int
1174
1185
final val MemberDefsOnly = 0 // add only member defs; skip other statements
You can’t perform that action at this time.
0 commit comments