Skip to content

Commit bd83faf

Browse files
committed
Avoid memory leaks in Accessors
Make sure that `AccessProxies.accessedBy` can be GCed.
1 parent b1848c0 commit bd83faf

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

compiler/src/dotty/tools/dotc/transform/ProtectedAccessors.scala

+15-5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import core.Decorators._
99
import core.Names.TermName
1010
import MegaPhase.MiniPhase
1111
import config.Printers.transforms
12+
import dotty.tools.dotc.util.Property
1213

1314
/** Add accessors for all protected accesses. An accessor is needed if
1415
* according to the rules of the JVM a protected class member is not accessible
@@ -50,7 +51,15 @@ class ProtectedAccessors extends MiniPhase {
5051

5152
override def phaseName: String = ProtectedAccessors.name
5253

53-
object Accessors extends AccessProxies {
54+
private val AccessorsKey = new Property.Key[Accessors]
55+
56+
private def accessors(using Context): Accessors =
57+
ctx.property(AccessorsKey).get
58+
59+
override def prepareForUnit(tree: Tree)(using Context): Context =
60+
ctx.fresh.setProperty(AccessorsKey, new Accessors)
61+
62+
private class Accessors extends AccessProxies {
5463
val insert: Insert = new Insert {
5564
def accessorNameOf(name: TermName, site: Symbol)(using Context): TermName = ProtectedAccessorName(name)
5665
def needsAccessor(sym: Symbol)(using Context) = ProtectedAccessors.needsAccessor(sym)
@@ -66,19 +75,20 @@ class ProtectedAccessors extends MiniPhase {
6675
}
6776

6877
override def transformIdent(tree: Ident)(using Context): Tree =
69-
Accessors.insert.accessorIfNeeded(tree)
78+
accessors.insert.accessorIfNeeded(tree)
7079

7180
override def transformSelect(tree: Select)(using Context): Tree =
72-
Accessors.insert.accessorIfNeeded(tree)
81+
accessors.insert.accessorIfNeeded(tree)
7382

7483
override def transformAssign(tree: Assign)(using Context): Tree =
7584
tree.lhs match {
7685
case lhs: RefTree if lhs.name.is(ProtectedAccessorName) =>
77-
cpy.Apply(tree)(Accessors.insert.useSetter(lhs), tree.rhs :: Nil)
86+
cpy.Apply(tree)(accessors.insert.useSetter(lhs), tree.rhs :: Nil)
7887
case _ =>
7988
tree
8089
}
8190

8291
override def transformTemplate(tree: Template)(using Context): Tree =
83-
cpy.Template(tree)(body = Accessors.addAccessorDefs(tree.symbol.owner, tree.body))
92+
cpy.Template(tree)(body = accessors.addAccessorDefs(tree.symbol.owner, tree.body))
93+
8494
}

0 commit comments

Comments
 (0)