@@ -137,16 +137,19 @@ object ClassTag {
137
137
val Nothing : ClassTag [scala.Nothing ] = Manifest .Nothing
138
138
val Null : ClassTag [scala.Null ] = Manifest .Null
139
139
140
- private [this ] val cache = new ClassValue [jWeakReference[ClassTag [_]]] {
141
- override def computeValue (runtimeClass : jClass[_]): jWeakReference[ClassTag [_]] = {
142
- new jWeakReference(runtimeClass match {
140
+ private val cacheDisabledProp = scala.sys.Prop [String ](" scala.reflect.classtag.cache.disable" )
141
+ private [this ] object cache extends ClassValue [jWeakReference[ClassTag [_]]] {
142
+ override def computeValue (runtimeClass : jClass[_]): jWeakReference[ClassTag [_]] =
143
+ new jWeakReference(computeTag(runtimeClass))
144
+
145
+ def computeTag (runtimeClass : jClass[_]): ClassTag [_] =
146
+ runtimeClass match {
143
147
case x if x.isPrimitive => primitiveClassTag(runtimeClass)
144
148
case ObjectTYPE => ClassTag .Object
145
149
case NothingTYPE => ClassTag .Nothing
146
150
case NullTYPE => ClassTag .Null
147
151
case _ => new GenericClassTag [AnyRef ](runtimeClass)
148
- })
149
- }
152
+ }
150
153
151
154
private def primitiveClassTag [T ](runtimeClass : Class [_]): ClassTag [_] = runtimeClass match {
152
155
case java.lang.Byte .TYPE => ClassTag .Byte
@@ -170,13 +173,17 @@ object ClassTag {
170
173
}
171
174
172
175
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
176
+ if (cacheDisabledProp.isSet)
177
+ cache.computeTag(runtimeClass1).asInstanceOf [ClassTag [T ]]
178
+ else {
179
+ val ref = cache.get(runtimeClass1).asInstanceOf [jWeakReference[ClassTag [T ]]]
180
+ var tag = ref.get
181
+ if (tag == null ) {
182
+ cache.remove(runtimeClass1)
183
+ tag = cache.computeTag(runtimeClass1).asInstanceOf [ClassTag [T ]]
184
+ }
185
+ tag
178
186
}
179
- tag
180
187
}
181
188
182
189
def unapply [T ](ctag : ClassTag [T ]): Option [Class [_]] = Some (ctag.runtimeClass)
0 commit comments