diff --git a/libraries/stdlib/jvm/src/kotlin/collections/builders/ListBuilder.kt b/libraries/stdlib/jvm/src/kotlin/collections/builders/ListBuilder.kt index d0161fe8562..83594d86771 100644 --- a/libraries/stdlib/jvm/src/kotlin/collections/builders/ListBuilder.kt +++ b/libraries/stdlib/jvm/src/kotlin/collections/builders/ListBuilder.kt @@ -179,15 +179,6 @@ internal class ListBuilder private constructor( // ---------------------------- private ---------------------------- - private fun ensureCapacity(minCapacity: Int) { - if (backing != null) throw IllegalStateException() // just in case somebody casts subList to ListBuilder - if (minCapacity < 0) throw OutOfMemoryError() // overflow - if (minCapacity > array.size) { - val newSize = AbstractList.newCapacity(array.size, minCapacity) - array = array.copyOfUninitializedElements(newSize) - } - } - private fun checkIsMutable() { if (isEffectivelyReadOnly) throw UnsupportedOperationException() } @@ -196,7 +187,15 @@ internal class ListBuilder private constructor( get() = isReadOnly || root != null && root.isReadOnly private fun ensureExtraCapacity(n: Int) { - ensureCapacity(length + n) + ensureCapacityInternal(length + n) + } + + private fun ensureCapacityInternal(minCapacity: Int) { + if (minCapacity < 0) throw OutOfMemoryError() // overflow + if (minCapacity > array.size) { + val newSize = AbstractList.newCapacity(array.size, minCapacity) + array = array.copyOfUninitializedElements(newSize) + } } private fun contentEquals(other: List<*>): Boolean { diff --git a/libraries/stdlib/native-wasm/src/kotlin/collections/ArrayList.kt b/libraries/stdlib/native-wasm/src/kotlin/collections/ArrayList.kt index 3fd7b13104d..fe544a7f5f7 100644 --- a/libraries/stdlib/native-wasm/src/kotlin/collections/ArrayList.kt +++ b/libraries/stdlib/native-wasm/src/kotlin/collections/ArrayList.kt @@ -146,11 +146,8 @@ actual class ArrayList private constructor( final actual fun ensureCapacity(minCapacity: Int) { if (backingList != null) throw IllegalStateException() // just in case somebody casts subList to ArrayList - if (minCapacity < 0) throw OutOfMemoryError() // overflow - if (minCapacity > backingArray.size) { - val newSize = AbstractList.newCapacity(backingArray.size, minCapacity) - backingArray = backingArray.copyOfUninitializedElements(newSize) - } + if (minCapacity <= backingArray.size) return + ensureCapacityInternal(minCapacity) } override fun equals(other: Any?): Boolean { @@ -214,7 +211,15 @@ actual class ArrayList private constructor( } private fun ensureExtraCapacity(n: Int) { - ensureCapacity(length + n) + ensureCapacityInternal(length + n) + } + + private fun ensureCapacityInternal(minCapacity: Int) { + if (minCapacity < 0) throw OutOfMemoryError() // overflow + if (minCapacity > backingArray.size) { + val newSize = AbstractList.newCapacity(backingArray.size, minCapacity) + backingArray = backingArray.copyOfUninitializedElements(newSize) + } } private fun contentEquals(other: List<*>): Boolean { diff --git a/libraries/stdlib/test/collections/CollectionTest.kt b/libraries/stdlib/test/collections/CollectionTest.kt index 732d7b11ee6..08fd76614ab 100644 --- a/libraries/stdlib/test/collections/CollectionTest.kt +++ b/libraries/stdlib/test/collections/CollectionTest.kt @@ -1256,4 +1256,9 @@ class CollectionTest { val arr2: Array = coll.toArray(Array(coll.size + 1) { "" }) assertEquals(data + listOf(null), arr2.asList()) } + + @Test + fun ensureCapacity() { + ArrayList().ensureCapacity(-1) // negative argument is ignored + } }