JVM_IR KT-45187 use Arrays.copyOf to copy an array in spread operator

Creating a new array (and copying data into it with System.arraycopy)
doesn't work in generic case, because the actual array class depends on
call site.
This commit is contained in:
Dmitry Petrov
2021-04-13 14:35:18 +03:00
committed by TeamCityServer
parent 334d0a8b5a
commit 7d62f0b5aa
10 changed files with 192 additions and 23 deletions
+13
View File
@@ -0,0 +1,13 @@
// TARGET_BACKEND: JVM
fun box(): String =
object : A<Void, Void>() {
override fun f(vararg params: Void): Void? = null
}.execute()
abstract class A<P, R> {
protected abstract fun f(vararg params: P): R?
fun execute(vararg params: P): String =
if (f(*params) == null) "OK" else "Fail"
}
+49 -1
View File
@@ -8,7 +8,15 @@ fun <T> copyArray(vararg data: T): Array<out T> = data
inline fun <reified T> reifiedCopyArray(vararg data: T): Array<out T> = data
fun copyBooleanArray(vararg data: Boolean): BooleanArray = data
fun copyByteArray(vararg data: Byte): ByteArray = data
fun copyCharArray(vararg data: Char): CharArray = data
fun copyShortArray(vararg data: Short): ShortArray = data
fun copyIntArray(vararg data: Int): IntArray = data
fun copyLongArray(vararg data: Long): LongArray = data
fun copyFloatArray(vararg data: Float): FloatArray = data
fun copyDoubleArray(vararg data: Double): DoubleArray = data
fun copyStringArray(vararg data: String): Array<out String> = data
fun box(): String {
val sarr = arrayOf("OK")
@@ -21,11 +29,51 @@ fun box(): String {
rsarr[0] = "Array was not copied"
assertEquals(rsarr2[0], "OK", "Failed: Array<String>, reified copy")
val boolArray = booleanArrayOf(true)
val boolArray2 = copyBooleanArray(*boolArray)
boolArray[0] = false
assertEquals(boolArray2[0], true, "Failed: BooleanArray")
val byteArray = byteArrayOf(1)
val byteArray2 = copyByteArray(*byteArray)
byteArray[0] = 42
assertEquals(1, byteArray2[0], "Failed: ByteArray")
val charArray = charArrayOf('a')
val charArray2 = copyCharArray(*charArray)
charArray[0] = 'b'
assertEquals(charArray2[0], 'a', "Failed: CharArray")
val shortArray = shortArrayOf(1)
val shortArray2 = copyShortArray(*shortArray)
shortArray[0] = 42
assertEquals(1, shortArray2[0], "Failed: ShortArray")
val iarr = IntArray(1)
iarr[0] = 1
val iarr2 = copyIntArray(*iarr)
iarr[0] = 42
assertEquals(iarr2[0], 1, "Failed: IntArray")
assertEquals(1, iarr2[0], "Failed: IntArray")
val longArray = longArrayOf(1L)
val longArray2 = copyLongArray(*longArray)
longArray[0] = 42L
assertEquals(1L, longArray2[0], "Failed: LongArray")
val floatArray = floatArrayOf(1.0f)
val floatArray2 = copyFloatArray(*floatArray)
floatArray[0] = 42.0f
assertEquals(1.0f, floatArray2[0], "Failed: FloatArray")
val doubleArray = doubleArrayOf(1.0)
val doubleArray2 = copyDoubleArray(*doubleArray)
doubleArray[0] = 42.0
assertEquals(1.0, doubleArray2[0], "Failed: DoubleArray")
val stringArray = arrayOf("abc")
val stringArray2 = copyStringArray(*stringArray)
stringArray[0] = "def"
assertEquals("abc", stringArray2[0], "Failed: Array<String>")
return "OK"
}