Skip to content

Commit af5b824

Browse files
committed
Merge branch 'perf-backport/6604-classtag-unapply-newarray' into perf-backport/omnibus
2 parents 0e48ba4 + d8f9ddc commit af5b824

File tree

2 files changed

+65
-27
lines changed

2 files changed

+65
-27
lines changed

library/src/scala/reflect/ClassTag.scala

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,7 @@ trait ClassTag[T] extends ClassManifestDeprecatedApis[T] with Equals with Serial
4646
def wrap: ClassTag[Array[T]] = ClassTag[Array[T]](arrayClass(runtimeClass))
4747

4848
/** Produces a new array with element type `T` and length `len` */
49-
override def newArray(len: Int): Array[T] =
50-
runtimeClass match {
51-
case java.lang.Byte.TYPE => new Array[Byte](len).asInstanceOf[Array[T]]
52-
case java.lang.Short.TYPE => new Array[Short](len).asInstanceOf[Array[T]]
53-
case java.lang.Character.TYPE => new Array[Char](len).asInstanceOf[Array[T]]
54-
case java.lang.Integer.TYPE => new Array[Int](len).asInstanceOf[Array[T]]
55-
case java.lang.Long.TYPE => new Array[Long](len).asInstanceOf[Array[T]]
56-
case java.lang.Float.TYPE => new Array[Float](len).asInstanceOf[Array[T]]
57-
case java.lang.Double.TYPE => new Array[Double](len).asInstanceOf[Array[T]]
58-
case java.lang.Boolean.TYPE => new Array[Boolean](len).asInstanceOf[Array[T]]
59-
case java.lang.Void.TYPE => new Array[Unit](len).asInstanceOf[Array[T]]
60-
case _ => java.lang.reflect.Array.newInstance(runtimeClass, len).asInstanceOf[Array[T]]
61-
}
49+
override def newArray(len: Int): Array[T]
6250

6351
/** A ClassTag[T] can serve as an extractor that matches only objects of type T.
6452
*
@@ -69,18 +57,7 @@ trait ClassTag[T] extends ClassManifestDeprecatedApis[T] with Equals with Serial
6957
* is uncheckable, but we have an instance of `ClassTag[T]`.
7058
*/
7159
def unapply(x: Any): Option[T] =
72-
if (null != x && (
73-
(runtimeClass.isInstance(x))
74-
|| (x.isInstanceOf[Byte] && runtimeClass.isAssignableFrom(classOf[Byte]))
75-
|| (x.isInstanceOf[Short] && runtimeClass.isAssignableFrom(classOf[Short]))
76-
|| (x.isInstanceOf[Char] && runtimeClass.isAssignableFrom(classOf[Char]))
77-
|| (x.isInstanceOf[Int] && runtimeClass.isAssignableFrom(classOf[Int]))
78-
|| (x.isInstanceOf[Long] && runtimeClass.isAssignableFrom(classOf[Long]))
79-
|| (x.isInstanceOf[Float] && runtimeClass.isAssignableFrom(classOf[Float]))
80-
|| (x.isInstanceOf[Double] && runtimeClass.isAssignableFrom(classOf[Double]))
81-
|| (x.isInstanceOf[Boolean] && runtimeClass.isAssignableFrom(classOf[Boolean]))
82-
|| (x.isInstanceOf[Unit] && runtimeClass.isAssignableFrom(classOf[Unit])))
83-
) Some(x.asInstanceOf[T])
60+
if (runtimeClass.isInstance(x)) Some(x.asInstanceOf[T])
8461
else None
8562

8663
// case class accessories
@@ -120,7 +97,11 @@ object ClassTag {
12097
val Null : ClassTag[scala.Null] = Manifest.Null
12198

12299
@SerialVersionUID(1L)
123-
private class GenericClassTag[T](val runtimeClass: jClass[_]) extends ClassTag[T]
100+
private class GenericClassTag[T](val runtimeClass: jClass[_]) extends ClassTag[T] {
101+
override def newArray(len: Int): Array[T] = {
102+
java.lang.reflect.Array.newInstance(runtimeClass, len).asInstanceOf[Array[T]]
103+
}
104+
}
124105

125106
def apply[T](runtimeClass1: jClass[_]): ClassTag[T] =
126107
runtimeClass1 match {

library/src/scala/reflect/Manifest.scala

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,12 @@ object ManifestFactory {
9393
override def newArray(len: Int): Array[Byte] = new Array[Byte](len)
9494
override def newWrappedArray(len: Int): WrappedArray[Byte] = new WrappedArray.ofByte(new Array[Byte](len))
9595
override def newArrayBuilder(): ArrayBuilder[Byte] = new ArrayBuilder.ofByte()
96+
override def unapply(x: Any): Option[Byte] = {
97+
x match {
98+
case d: Byte => Some(d)
99+
case _ => None
100+
}
101+
}
96102
private def readResolve(): Any = Manifest.Byte
97103
}
98104
val Byte: AnyValManifest[Byte] = new ByteManifest
@@ -103,6 +109,12 @@ object ManifestFactory {
103109
override def newArray(len: Int): Array[Short] = new Array[Short](len)
104110
override def newWrappedArray(len: Int): WrappedArray[Short] = new WrappedArray.ofShort(new Array[Short](len))
105111
override def newArrayBuilder(): ArrayBuilder[Short] = new ArrayBuilder.ofShort()
112+
override def unapply(x: Any): Option[Short] = {
113+
x match {
114+
case d: Short => Some(d)
115+
case _ => None
116+
}
117+
}
106118
private def readResolve(): Any = Manifest.Short
107119
}
108120
val Short: AnyValManifest[Short] = new ShortManifest
@@ -113,6 +125,12 @@ object ManifestFactory {
113125
override def newArray(len: Int): Array[Char] = new Array[Char](len)
114126
override def newWrappedArray(len: Int): WrappedArray[Char] = new WrappedArray.ofChar(new Array[Char](len))
115127
override def newArrayBuilder(): ArrayBuilder[Char] = new ArrayBuilder.ofChar()
128+
override def unapply(x: Any): Option[Char] = {
129+
x match {
130+
case d: Char => Some(d)
131+
case _ => None
132+
}
133+
}
116134
private def readResolve(): Any = Manifest.Char
117135
}
118136
val Char: AnyValManifest[Char] = new CharManifest
@@ -123,6 +141,12 @@ object ManifestFactory {
123141
override def newArray(len: Int): Array[Int] = new Array[Int](len)
124142
override def newWrappedArray(len: Int): WrappedArray[Int] = new WrappedArray.ofInt(new Array[Int](len))
125143
override def newArrayBuilder(): ArrayBuilder[Int] = new ArrayBuilder.ofInt()
144+
override def unapply(x: Any): Option[Int] = {
145+
x match {
146+
case d: Int => Some(d)
147+
case _ => None
148+
}
149+
}
126150
private def readResolve(): Any = Manifest.Int
127151
}
128152
val Int: AnyValManifest[Int] = new IntManifest
@@ -133,6 +157,12 @@ object ManifestFactory {
133157
override def newArray(len: Int): Array[Long] = new Array[Long](len)
134158
override def newWrappedArray(len: Int): WrappedArray[Long] = new WrappedArray.ofLong(new Array[Long](len))
135159
override def newArrayBuilder(): ArrayBuilder[Long] = new ArrayBuilder.ofLong()
160+
override def unapply(x: Any): Option[Long] = {
161+
x match {
162+
case d: Long => Some(d)
163+
case _ => None
164+
}
165+
}
136166
private def readResolve(): Any = Manifest.Long
137167
}
138168
val Long: AnyValManifest[Long] = new LongManifest
@@ -143,16 +173,31 @@ object ManifestFactory {
143173
override def newArray(len: Int): Array[Float] = new Array[Float](len)
144174
override def newWrappedArray(len: Int): WrappedArray[Float] = new WrappedArray.ofFloat(new Array[Float](len))
145175
override def newArrayBuilder(): ArrayBuilder[Float] = new ArrayBuilder.ofFloat()
176+
override def unapply(x: Any): Option[Float] = {
177+
x match {
178+
case d: Float => Some(d)
179+
case _ => None
180+
}
181+
}
146182
private def readResolve(): Any = Manifest.Float
147183
}
148184
val Float: AnyValManifest[Float] = new FloatManifest
149185

150186
@SerialVersionUID(1L)
151187
private class DoubleManifest extends AnyValManifest[scala.Double]("Double") {
152188
def runtimeClass = java.lang.Double.TYPE
153-
override def newArray(len: Int): Array[Double] = new Array[Double](len)
189+
override def newArray(len: Int): Array[Double] = {
190+
new Array[Double](len)
191+
}
154192
override def newWrappedArray(len: Int): WrappedArray[Double] = new WrappedArray.ofDouble(new Array[Double](len))
155193
override def newArrayBuilder(): ArrayBuilder[Double] = new ArrayBuilder.ofDouble()
194+
195+
override def unapply(x: Any): Option[Double] = {
196+
x match {
197+
case d: Double => Some(d)
198+
case _ => None
199+
}
200+
}
156201
private def readResolve(): Any = Manifest.Double
157202
}
158203
val Double: AnyValManifest[Double] = new DoubleManifest
@@ -163,6 +208,12 @@ object ManifestFactory {
163208
override def newArray(len: Int): Array[Boolean] = new Array[Boolean](len)
164209
override def newWrappedArray(len: Int): WrappedArray[Boolean] = new WrappedArray.ofBoolean(new Array[Boolean](len))
165210
override def newArrayBuilder(): ArrayBuilder[Boolean] = new ArrayBuilder.ofBoolean()
211+
override def unapply(x: Any): Option[Boolean] = {
212+
x match {
213+
case d: Boolean => Some(d)
214+
case _ => None
215+
}
216+
}
166217
private def readResolve(): Any = Manifest.Boolean
167218
}
168219
val Boolean: AnyValManifest[Boolean] = new BooleanManifest
@@ -176,6 +227,12 @@ object ManifestFactory {
176227
override protected def arrayClass[T](tp: Class[_]): Class[Array[T]] =
177228
if (tp eq runtimeClass) classOf[Array[scala.runtime.BoxedUnit]].asInstanceOf[Class[Array[T]]]
178229
else super.arrayClass(tp)
230+
override def unapply(x: Any): Option[Unit] = {
231+
x match {
232+
case d: Unit => Some(d)
233+
case _ => None
234+
}
235+
}
179236
private def readResolve(): Any = Manifest.Unit
180237
}
181238
val Unit: AnyValManifest[Unit] = new UnitManifest

0 commit comments

Comments
 (0)