@@ -14,6 +14,7 @@ import mutable.{ ArrayBuilder, ArraySeq }
14
14
import scala .compat .Platform .arraycopy
15
15
import scala .reflect .ClassTag
16
16
import scala .runtime .ScalaRunTime .{ array_apply , array_update }
17
+ import dotty .runtime .vc ._
17
18
18
19
/** Contains a fallback builder for arrays when the element type
19
20
* does not have a class tag. In that case a generic array is built.
@@ -115,13 +116,73 @@ object Array extends FallbackArrayBuilding {
115
116
* @param xs the elements to put in the array
116
117
* @return an array containing all elements from xs.
117
118
*/
118
- // Subject to a compiler optimization in Cleanup.
119
- // Array(e0, ..., en) is translated to { val a = new Array(3); a(i) = ei; a }
120
- def apply [T : ClassTag ](xs : T * ): Array [T ] = {
121
- val array = new Array [T ](xs.length)
119
+ def apply [T ](xs : T * )(implicit ct : ClassTag [T ]): Array [T ] = {
122
120
var i = 0
123
- for (x <- xs.iterator) { array(i) = x; i += 1 }
124
- array
121
+ xs match {
122
+ case vcwra : VCWrappedArray [T ] =>
123
+ (vcwra.array: Object ) match {
124
+ case vcia : VCIntArray [_] =>
125
+ val oldUndArr = vcia.arr
126
+ val newArr = new Array [T ](vcia.length)
127
+ val newUndArr = newArr.asInstanceOf [VCIntArray [_]].arr
128
+ for (x <- oldUndArr.iterator) { newUndArr(i) = x; i += 1 }
129
+ newArr
130
+ case vcoa : VCObjectArray [_] =>
131
+ val oldUndArr = vcoa.arr
132
+ val newArr = new Array [T ](vcoa.length)
133
+ val newUndArr = newArr.asInstanceOf [VCObjectArray [_]].arr
134
+ for (x <- oldUndArr.iterator) { newUndArr(i) = x; i += 1 }
135
+ newArr
136
+ case vcba : VCByteArray [_] =>
137
+ val oldUndArr = vcba.arr
138
+ val newArr = new Array [T ](vcba.length)
139
+ val newUndArr = newArr.asInstanceOf [VCByteArray [_]].arr
140
+ for (x <- oldUndArr.iterator) { newUndArr(i) = x; i += 1 }
141
+ newArr
142
+ case vcboola : VCBooleanArray [_] =>
143
+ val oldUndArr = vcboola.arr
144
+ val newArr = new Array [T ](vcboola.length)
145
+ val newUndArr = newArr.asInstanceOf [VCBooleanArray [_]].arr
146
+ for (x <- oldUndArr.iterator) { newUndArr(i) = x; i += 1 }
147
+ newArr
148
+ case vcla : VCLongArray [_] =>
149
+ val oldUndArr = vcla.arr
150
+ val newArr = new Array [T ](vcla.length)
151
+ val newUndArr = newArr.asInstanceOf [VCLongArray [_]].arr
152
+ for (x <- oldUndArr.iterator) { newUndArr(i) = x; i += 1 }
153
+ newArr
154
+ case vcfa : VCFloatArray [_] =>
155
+ val oldUndArr = vcfa.arr
156
+ val newArr = new Array [T ](vcfa.length)
157
+ val newUndArr = newArr.asInstanceOf [VCFloatArray [_]].arr
158
+ for (x <- oldUndArr.iterator) { newUndArr(i) = x; i += 1 }
159
+ newArr
160
+ case vcda : VCDoubleArray [_] =>
161
+ val oldUndArr = vcda.arr
162
+ val newArr = new Array [T ](vcda.length)
163
+ val newUndArr = newArr.asInstanceOf [VCDoubleArray [_]].arr
164
+ for (x <- oldUndArr.iterator) { newUndArr(i) = x; i += 1 }
165
+ newArr
166
+ case vcca : VCCharArray [_] =>
167
+ val oldUndArr = vcca.arr
168
+ val newArr = new Array [T ](vcca.length)
169
+ val newUndArr = newArr.asInstanceOf [VCCharArray [_]].arr
170
+ for (x <- oldUndArr.iterator) { newUndArr(i) = x; i += 1 }
171
+ newArr
172
+ case vcsa : VCShortArray [_] =>
173
+ val oldUndArr = vcsa.arr
174
+ val newArr = new Array [T ](vcsa.length)
175
+ val newUndArr = newArr.asInstanceOf [VCShortArray [_]].arr
176
+ for (x <- oldUndArr.iterator) { newUndArr(i) = x; i += 1 }
177
+ newArr
178
+ }
179
+ case _ =>
180
+ // Subject to a compiler optimization in Cleanup.
181
+ // Array(e0, ..., en) is translated to { val a = new Array(3); a(i) = ei; a }
182
+ val array = new Array [T ](xs.length)
183
+ for (x <- xs.iterator) { array(i) = x; i += 1 }
184
+ array
185
+ }
125
186
}
126
187
127
188
/** Creates an array of `Boolean` objects */
0 commit comments