Add argument validation in copyOf(newSize) in JS
#KT-19489
This commit is contained in:
@@ -504,6 +504,7 @@ public actual fun CharArray.copyOf(): CharArray {
|
|||||||
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
||||||
*/
|
*/
|
||||||
public actual fun ByteArray.copyOf(newSize: Int): ByteArray {
|
public actual fun ByteArray.copyOf(newSize: Int): ByteArray {
|
||||||
|
require(newSize >= 0) { "Invalid new array size: $newSize." }
|
||||||
return fillFrom(this, ByteArray(newSize))
|
return fillFrom(this, ByteArray(newSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -517,6 +518,7 @@ public actual fun ByteArray.copyOf(newSize: Int): ByteArray {
|
|||||||
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
||||||
*/
|
*/
|
||||||
public actual fun ShortArray.copyOf(newSize: Int): ShortArray {
|
public actual fun ShortArray.copyOf(newSize: Int): ShortArray {
|
||||||
|
require(newSize >= 0) { "Invalid new array size: $newSize." }
|
||||||
return fillFrom(this, ShortArray(newSize))
|
return fillFrom(this, ShortArray(newSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -530,6 +532,7 @@ public actual fun ShortArray.copyOf(newSize: Int): ShortArray {
|
|||||||
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
||||||
*/
|
*/
|
||||||
public actual fun IntArray.copyOf(newSize: Int): IntArray {
|
public actual fun IntArray.copyOf(newSize: Int): IntArray {
|
||||||
|
require(newSize >= 0) { "Invalid new array size: $newSize." }
|
||||||
return fillFrom(this, IntArray(newSize))
|
return fillFrom(this, IntArray(newSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -543,6 +546,7 @@ public actual fun IntArray.copyOf(newSize: Int): IntArray {
|
|||||||
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
||||||
*/
|
*/
|
||||||
public actual fun LongArray.copyOf(newSize: Int): LongArray {
|
public actual fun LongArray.copyOf(newSize: Int): LongArray {
|
||||||
|
require(newSize >= 0) { "Invalid new array size: $newSize." }
|
||||||
return withType("LongArray", arrayCopyResize(this, newSize, 0L))
|
return withType("LongArray", arrayCopyResize(this, newSize, 0L))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -556,6 +560,7 @@ public actual fun LongArray.copyOf(newSize: Int): LongArray {
|
|||||||
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
||||||
*/
|
*/
|
||||||
public actual fun FloatArray.copyOf(newSize: Int): FloatArray {
|
public actual fun FloatArray.copyOf(newSize: Int): FloatArray {
|
||||||
|
require(newSize >= 0) { "Invalid new array size: $newSize." }
|
||||||
return fillFrom(this, FloatArray(newSize))
|
return fillFrom(this, FloatArray(newSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -569,6 +574,7 @@ public actual fun FloatArray.copyOf(newSize: Int): FloatArray {
|
|||||||
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
||||||
*/
|
*/
|
||||||
public actual fun DoubleArray.copyOf(newSize: Int): DoubleArray {
|
public actual fun DoubleArray.copyOf(newSize: Int): DoubleArray {
|
||||||
|
require(newSize >= 0) { "Invalid new array size: $newSize." }
|
||||||
return fillFrom(this, DoubleArray(newSize))
|
return fillFrom(this, DoubleArray(newSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -582,6 +588,7 @@ public actual fun DoubleArray.copyOf(newSize: Int): DoubleArray {
|
|||||||
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
||||||
*/
|
*/
|
||||||
public actual fun BooleanArray.copyOf(newSize: Int): BooleanArray {
|
public actual fun BooleanArray.copyOf(newSize: Int): BooleanArray {
|
||||||
|
require(newSize >= 0) { "Invalid new array size: $newSize." }
|
||||||
return withType("BooleanArray", arrayCopyResize(this, newSize, false))
|
return withType("BooleanArray", arrayCopyResize(this, newSize, false))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -595,6 +602,7 @@ public actual fun BooleanArray.copyOf(newSize: Int): BooleanArray {
|
|||||||
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
* @sample samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf
|
||||||
*/
|
*/
|
||||||
public actual fun CharArray.copyOf(newSize: Int): CharArray {
|
public actual fun CharArray.copyOf(newSize: Int): CharArray {
|
||||||
|
require(newSize >= 0) { "Invalid new array size: $newSize." }
|
||||||
return withType("CharArray", fillFrom(this, CharArray(newSize)))
|
return withType("CharArray", fillFrom(this, CharArray(newSize)))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -609,6 +617,7 @@ public actual fun CharArray.copyOf(newSize: Int): CharArray {
|
|||||||
*/
|
*/
|
||||||
@Suppress("ACTUAL_WITHOUT_EXPECT")
|
@Suppress("ACTUAL_WITHOUT_EXPECT")
|
||||||
public actual fun <T> Array<out T>.copyOf(newSize: Int): Array<T?> {
|
public actual fun <T> Array<out T>.copyOf(newSize: Int): Array<T?> {
|
||||||
|
require(newSize >= 0) { "Invalid new array size: $newSize." }
|
||||||
return arrayCopyResize(this, newSize, null)
|
return arrayCopyResize(this, newSize, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -724,6 +724,17 @@ class ArraysTest {
|
|||||||
|
|
||||||
assertArrayNotSameButEquals(charArrayOf('A', 'B'), charArrayOf('A', 'B', 'C').copyOf(2))
|
assertArrayNotSameButEquals(charArrayOf('A', 'B'), charArrayOf('A', 'B', 'C').copyOf(2))
|
||||||
assertArrayNotSameButEquals(charArrayOf('A', 'B', '\u0000'), charArrayOf('A', 'B').copyOf(3))
|
assertArrayNotSameButEquals(charArrayOf('A', 'B', '\u0000'), charArrayOf('A', 'B').copyOf(3))
|
||||||
|
|
||||||
|
assertArrayNotSameButEquals(emptyArray(), arrayOf("x").copyOf(0))
|
||||||
|
assertArrayNotSameButEquals(intArrayOf(), intArrayOf(1).copyOf(0))
|
||||||
|
assertArrayNotSameButEquals(longArrayOf(), longArrayOf(1).copyOf(0))
|
||||||
|
assertArrayNotSameButEquals(charArrayOf(), charArrayOf('a').copyOf(0))
|
||||||
|
|
||||||
|
// RuntimeException is the most specific common of JVM and JS implementations
|
||||||
|
assertFailsWith<RuntimeException> { arrayOf("x").copyOf(-1) }
|
||||||
|
assertFailsWith<RuntimeException> { intArrayOf().copyOf(-1) }
|
||||||
|
assertFailsWith<RuntimeException> { longArrayOf().copyOf(-1) }
|
||||||
|
assertFailsWith<RuntimeException> { charArrayOf('c').copyOf(-1) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test fun copyOfRange() {
|
@Test fun copyOfRange() {
|
||||||
|
|||||||
@@ -453,6 +453,7 @@ object ArrayOps : TemplateGroupBase() {
|
|||||||
- If [newSize] is greater than the size of the original array, the extra elements in the copy array are filled with ${primitive.zero} values.
|
- If [newSize] is greater than the size of the original array, the extra elements in the copy array are filled with ${primitive.zero} values.
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
val newSizeCheck = """require(newSize >= 0) { "Invalid new array size: ${'$'}newSize." }"""
|
||||||
specialFor(ArraysOfPrimitives) {
|
specialFor(ArraysOfPrimitives) {
|
||||||
sample("samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf")
|
sample("samples.collections.Arrays.CopyOfOperations.resizedPrimitiveCopyOf")
|
||||||
returns("SELF")
|
returns("SELF")
|
||||||
@@ -467,6 +468,7 @@ object ArrayOps : TemplateGroupBase() {
|
|||||||
else ->
|
else ->
|
||||||
body { "return fillFrom(this, ${primitive}Array(newSize))" }
|
body { "return fillFrom(this, ${primitive}Array(newSize))" }
|
||||||
}
|
}
|
||||||
|
body { newSizeCheck + "\n" + body }
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -476,7 +478,12 @@ object ArrayOps : TemplateGroupBase() {
|
|||||||
on(Platform.JS) {
|
on(Platform.JS) {
|
||||||
family = ArraysOfObjects
|
family = ArraysOfObjects
|
||||||
suppress("ACTUAL_WITHOUT_EXPECT") // TODO: KT-21937
|
suppress("ACTUAL_WITHOUT_EXPECT") // TODO: KT-21937
|
||||||
body { "return arrayCopyResize(this, newSize, null)" }
|
body {
|
||||||
|
"""
|
||||||
|
$newSizeCheck
|
||||||
|
return arrayCopyResize(this, newSize, null)
|
||||||
|
"""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
on(Platform.JVM) {
|
on(Platform.JVM) {
|
||||||
|
|||||||
Reference in New Issue
Block a user