@@ -14,7 +14,7 @@ import mutable.ArrayBuilder
14
14
import immutable .ArraySeq
15
15
import scala .language .implicitConversions
16
16
import scala .reflect .ClassTag
17
- import scala .runtime .ScalaRunTime
17
+ import scala .runtime .{ BoxedUnit , ScalaRunTime }
18
18
import scala .runtime .ScalaRunTime .{array_apply , array_update }
19
19
20
20
/** Utility methods for operating on arrays.
@@ -122,6 +122,7 @@ object Array {
122
122
* @see `java.util.Arrays#copyOf`
123
123
*/
124
124
def copyOf [A ](original : Array [A ], newLength : Int ): Array [A ] = (original match {
125
+ case x : Array [BoxedUnit ] => newUnitArray(newLength).asInstanceOf [Array [A ]]
125
126
case x : Array [AnyRef ] => java.util.Arrays .copyOf(x, newLength)
126
127
case x : Array [Int ] => java.util.Arrays .copyOf(x, newLength)
127
128
case x : Array [Double ] => java.util.Arrays .copyOf(x, newLength)
@@ -131,10 +132,6 @@ object Array {
131
132
case x : Array [Byte ] => java.util.Arrays .copyOf(x, newLength)
132
133
case x : Array [Short ] => java.util.Arrays .copyOf(x, newLength)
133
134
case x : Array [Boolean ] => java.util.Arrays .copyOf(x, newLength)
134
- case x : Array [Unit ] =>
135
- val dest = new Array [Unit ](newLength)
136
- Array .copy(original, 0 , dest, 0 , original.length)
137
- dest
138
135
}).asInstanceOf [Array [A ]]
139
136
140
137
/** Copy one array to another, truncating or padding with default values (if
@@ -151,20 +148,30 @@ object Array {
151
148
* @see `java.util.Arrays#copyOf`
152
149
*/
153
150
def copyAs [A ](original : Array [_], newLength : Int )(implicit ct : ClassTag [A ]): Array [A ] = {
154
- val destClass = ct.runtimeClass.asInstanceOf [Class [A ]]
155
- if (destClass.isAssignableFrom(original.getClass.getComponentType)) {
156
- if (destClass.isPrimitive) copyOf[A ](original.asInstanceOf [Array [A ]], newLength)
157
- else {
158
- val destArrayClass = java.lang.reflect.Array .newInstance(destClass, 0 ).getClass.asInstanceOf [Class [Array [AnyRef ]]]
159
- java.util.Arrays .copyOf(original.asInstanceOf [Array [AnyRef ]], newLength, destArrayClass).asInstanceOf [Array [A ]]
151
+ val runtimeClass = ct.runtimeClass
152
+ if (runtimeClass == Void .TYPE ) newUnitArray(newLength).asInstanceOf [Array [A ]]
153
+ else {
154
+ val destClass = runtimeClass.asInstanceOf [Class [A ]]
155
+ if (destClass.isAssignableFrom(original.getClass.getComponentType)) {
156
+ if (destClass.isPrimitive) copyOf[A ](original.asInstanceOf [Array [A ]], newLength)
157
+ else {
158
+ val destArrayClass = java.lang.reflect.Array .newInstance(destClass, 0 ).getClass.asInstanceOf [Class [Array [AnyRef ]]]
159
+ java.util.Arrays .copyOf(original.asInstanceOf [Array [AnyRef ]], newLength, destArrayClass).asInstanceOf [Array [A ]]
160
+ }
161
+ } else {
162
+ val dest = new Array [A ](newLength)
163
+ Array .copy(original, 0 , dest, 0 , original.length)
164
+ dest
160
165
}
161
- } else {
162
- val dest = new Array [A ](newLength)
163
- Array .copy(original, 0 , dest, 0 , original.length)
164
- dest
165
166
}
166
167
}
167
168
169
+ private def newUnitArray (len : Int ): Array [Unit ] = {
170
+ val result = new Array [Unit ](len)
171
+ java.util.Arrays .fill(result.asInstanceOf [Array [AnyRef ]], ())
172
+ result
173
+ }
174
+
168
175
/** Returns an array of length 0 */
169
176
def empty [T : ClassTag ]: Array [T ] = new Array [T ](0 )
170
177
0 commit comments