@@ -14,6 +14,7 @@ import mutable.{ ArrayBuilder, ArraySeq }
1414import scala .compat .Platform .arraycopy
1515import scala .reflect .ClassTag
1616import scala .runtime .ScalaRunTime .{ array_apply , array_update }
17+ import dotty .runtime .vc ._
1718
1819/** Contains a fallback builder for arrays when the element type
1920 * does not have a class tag. In that case a generic array is built.
@@ -115,13 +116,73 @@ object Array extends FallbackArrayBuilding {
115116 * @param xs the elements to put in the array
116117 * @return an array containing all elements from xs.
117118 */
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 ] = {
122120 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+ }
125186 }
126187
127188 /** Creates an array of `Boolean` objects */
0 commit comments