@@ -14,6 +14,7 @@ package scala
14
14
package reflect
15
15
16
16
import java .lang .{ Class => jClass }
17
+ import java .lang .ref .{WeakReference => jWeakReference }
17
18
18
19
import scala .collection .mutable
19
20
import scala .runtime .BoxedUnit
@@ -136,15 +137,15 @@ object ClassTag {
136
137
val Nothing : ClassTag [scala.Nothing ] = Manifest .Nothing
137
138
val Null : ClassTag [scala.Null ] = Manifest .Null
138
139
139
- private [this ] val cache = new ClassValue [ClassTag [_]] {
140
- override def computeValue (runtimeClass : jClass[_]): ClassTag [_] = {
141
- runtimeClass match {
140
+ private [this ] val cache = new ClassValue [jWeakReference[ ClassTag [_] ]] {
141
+ override def computeValue (runtimeClass : jClass[_]): jWeakReference[ ClassTag [_] ] = {
142
+ new jWeakReference( runtimeClass match {
142
143
case x if x.isPrimitive => primitiveClassTag(runtimeClass)
143
144
case ObjectTYPE => ClassTag .Object
144
145
case NothingTYPE => ClassTag .Nothing
145
146
case NullTYPE => ClassTag .Null
146
147
case _ => new GenericClassTag [AnyRef ](runtimeClass)
147
- }
148
+ })
148
149
}
149
150
150
151
private def primitiveClassTag [T ](runtimeClass : Class [_]): ClassTag [_] = runtimeClass match {
@@ -168,7 +169,15 @@ object ClassTag {
168
169
}
169
170
}
170
171
171
- def apply [T ](runtimeClass1 : jClass[_]): ClassTag [T ] = cache.get(runtimeClass1).asInstanceOf [ClassTag [T ]]
172
+ def apply [T ](runtimeClass1 : jClass[_]): ClassTag [T ] = {
173
+ val ref = cache.get(runtimeClass1).asInstanceOf [jWeakReference[ClassTag [T ]]]
174
+ var tag = ref.get
175
+ if (tag == null ) {
176
+ cache.remove(runtimeClass1)
177
+ tag = cache.get(runtimeClass1).asInstanceOf [jWeakReference[ClassTag [T ]]].get
178
+ }
179
+ tag
180
+ }
172
181
173
182
def unapply [T ](ctag : ClassTag [T ]): Option [Class [_]] = Some (ctag.runtimeClass)
174
183
}
0 commit comments