Skip to content

Commit a57809f

Browse files
committed
Fix for vc arrays creation: don't box values during array creation
1 parent b22c71d commit a57809f

File tree

1 file changed

+67
-6
lines changed

1 file changed

+67
-6
lines changed

src/scala/Array.scala

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import mutable.{ ArrayBuilder, ArraySeq }
1414
import scala.compat.Platform.arraycopy
1515
import scala.reflect.ClassTag
1616
import 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

Comments
 (0)