Skip to content

Commit 60a1981

Browse files
committed
review feedback - use the ClassTag to hold the empty Arrays and WrappedArray
1 parent 8f2ba61 commit 60a1981

File tree

3 files changed

+17
-30
lines changed

3 files changed

+17
-30
lines changed

library/src/scala/Array.scala

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,6 @@ class FallbackArrayBuilding {
5151
* @since 1.0
5252
*/
5353
object Array extends FallbackArrayBuilding {
54-
private val emptyArrays = new ClassValue[AnyRef] {
55-
override def computeValue(cls: Class[_]): AnyRef =
56-
java.lang.reflect.Array.newInstance(cls, 0)
57-
}
5854

5955
val emptyBooleanArray = empty[Boolean]
6056
val emptyByteArray = empty[Byte]
@@ -188,8 +184,7 @@ object Array extends FallbackArrayBuilding {
188184

189185
/** Returns an array of length 0 */
190186
def empty[T: ClassTag]: Array[T] = {
191-
val cls = implicitly[ClassTag[T]].runtimeClass.asInstanceOf[Class[T]]
192-
emptyArrays.get(cls).asInstanceOf[Array[T]]
187+
implicitly[ClassTag[T]].emptyArray
193188
}
194189
/** Creates an array with given elements.
195190
*

library/src/scala/collection/mutable/WrappedArrayBuilder.scala

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class WrappedArrayBuilder[A](tag: ClassTag[A]) extends ReusableBuilder[A, Wrappe
3535
private var size: Int = 0
3636

3737
private def mkArray(size: Int): WrappedArray[A] = {
38-
if (size == 0) WrappedArrayBuilder.emptyWrappedArray(tag)
38+
if (size == 0) tag.emptyWrappedArray
3939
else {
4040
import java.util.Arrays.copyOf
4141
val runtimeClass = tag.runtimeClass
@@ -111,25 +111,4 @@ class WrappedArrayBuilder[A](tag: ClassTag[A]) extends ReusableBuilder[A, Wrappe
111111
}
112112

113113
// todo: add ++=
114-
}
115-
private [mutable] object WrappedArrayBuilder {
116-
private def emptyWrappedArray[T](tag: ClassTag[T]): mutable.WrappedArray[T] =
117-
emptyClass.get(tag.runtimeClass).asInstanceOf[WrappedArray[T]]
118-
private[this] val emptyClass = new ClassValue[WrappedArray[_]] {
119-
override def computeValue(cls: Class[_]): WrappedArray[_] = {
120-
if (cls.isPrimitive)
121-
cls match {
122-
case java.lang.Integer.TYPE => new WrappedArray.ofInt(Array.emptyIntArray)
123-
case java.lang.Double.TYPE => new WrappedArray.ofDouble(Array.emptyDoubleArray)
124-
case java.lang.Long.TYPE => new WrappedArray.ofLong(Array.emptyLongArray)
125-
case java.lang.Float.TYPE => new WrappedArray.ofFloat(Array.emptyFloatArray)
126-
case java.lang.Character.TYPE => new WrappedArray.ofChar(Array.emptyCharArray)
127-
case java.lang.Byte.TYPE => new WrappedArray.ofByte(Array.emptyByteArray)
128-
case java.lang.Short.TYPE => new WrappedArray.ofShort(Array.emptyShortArray)
129-
case java.lang.Boolean.TYPE => new WrappedArray.ofBoolean(Array.emptyBooleanArray)
130-
case java.lang.Void.TYPE => new WrappedArray.ofUnit(Array.emptyUnitArray)
131-
}
132-
else new WrappedArray.ofRef(Array.empty[AnyRef])
133-
}
134-
}
135-
}
114+
}

library/src/scala/reflect/ClassTag.scala

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ package reflect
1515

1616
import java.lang.{ Class => jClass }
1717

18+
import scala.collection.mutable
19+
import scala.runtime.BoxedUnit
20+
1821
/**
1922
*
2023
* A `ClassTag[T]` stores the erased class of a given type `T`, accessible via the `runtimeClass`
@@ -46,6 +49,15 @@ import java.lang.{ Class => jClass }
4649
*/
4750
@scala.annotation.implicitNotFound(msg = "No ClassTag available for ${T}")
4851
trait ClassTag[T] extends ClassManifestDeprecatedApis[T] with Equals with Serializable {
52+
53+
@transient private[scala] lazy val emptyArray : Array[T] = {
54+
val componentType =
55+
if (runtimeClass eq classOf[Void]) classOf[BoxedUnit] else runtimeClass
56+
java.lang.reflect.Array.newInstance(componentType, 0).asInstanceOf[Array[T]]
57+
}
58+
@transient private[scala] lazy val emptyWrappedArray: mutable.WrappedArray[T] =
59+
mutable.WrappedArray.make[T](emptyArray)
60+
4961
// please, don't add any APIs here, like it was with `newWrappedArray` and `newArrayBuilder`
5062
// class tags, and all tags in general, should be as minimalistic as possible
5163

@@ -151,7 +163,8 @@ object ClassTag {
151163
@SerialVersionUID(1L)
152164
private class GenericClassTag[T](val runtimeClass: jClass[_]) extends ClassTag[T] {
153165
override def newArray(len: Int): Array[T] = {
154-
java.lang.reflect.Array.newInstance(runtimeClass, len).asInstanceOf[Array[T]]
166+
if (len == 0) emptyArray
167+
else java.lang.reflect.Array.newInstance(runtimeClass, len).asInstanceOf[Array[T]]
155168
}
156169
}
157170

0 commit comments

Comments
 (0)