Skip to content

Commit d90b7f9

Browse files
committed
Avoid memory leak in ham-fisted attempt to use WeakMap as a cache
1 parent 253cc63 commit d90b7f9

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

src/main/scala/scala/async/internal/AsyncMacro.scala

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
package scala.async.internal
22

3-
import java.util
4-
53
object AsyncMacro {
6-
private val nameCache = new util.WeakHashMap[Object, AsyncNames[_]]()
74
def apply(c0: reflect.macros.Context, base: AsyncBase)(body0: c0.Tree): AsyncMacro { val c: c0.type } = {
85
import language.reflectiveCalls
9-
val asyncNames0 = nameCache.synchronized[AsyncNames[_]] {
10-
nameCache.computeIfAbsent(c0.universe, new java.util.function.Function[Object, AsyncNames[_]] {
11-
override def apply(t: Object): AsyncNames[_] = new AsyncNames[c0.universe.type](c0.universe)
12-
})
6+
7+
// Use an attachment on RootClass as a sneaky place for a per-Global cache
8+
val att = c0.internal.attachments(c0.universe.rootMirror.RootClass)
9+
val names = att.get[AsyncNames[_]].getOrElse {
10+
val names = new AsyncNames[c0.universe.type](c0.universe)
11+
att.update(names)
12+
names
1313
}
14+
1415
new AsyncMacro { self =>
1516
val c: c0.type = c0
16-
val asyncNames: AsyncNames[c.universe.type] = asyncNames0.asInstanceOf[AsyncNames[c.universe.type]]
17+
val asyncNames: AsyncNames[c.universe.type] = names.asInstanceOf[AsyncNames[c.universe.type]]
1718
val body: c.Tree = body0
1819
// This member is required by `AsyncTransform`:
1920
val asyncBase: AsyncBase = base

0 commit comments

Comments
 (0)