Skip to content

Commit e023784

Browse files
committed
Add cyclic reference detection to TASTY unpickling
1 parent 1ab6027 commit e023784

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -631,8 +631,13 @@ class TreeUnpickler(reader: TastyReader,
631631
* or else read definition.
632632
*/
633633
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}")
636+
skipTree()
637+
tree
638+
case none =>
639+
treeAtAddr.put(currentAddr, PoisonTree)
640+
readNewDef()
636641
}
637642

638643
private def readNewDef()(implicit ctx: Context): Tree = {
@@ -1169,6 +1174,9 @@ class TreeUnpickler(reader: TastyReader,
11691174

11701175
object TreeUnpickler {
11711176

1177+
/** A marker value used to detect cyclic reference while unpickling definitions. */
1178+
@sharable val PoisonTree: tpd.Tree = Thicket(Nil)
1179+
11721180
/** An enumeration indicating which subtrees should be added to an OwnerTree. */
11731181
type MemberDefMode = Int
11741182
final val MemberDefsOnly = 0 // add only member defs; skip other statements

0 commit comments

Comments
 (0)