From 6ad6bca503c3975565e5d74b0be88df4b923c54a Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Wed, 22 Sep 2021 21:41:40 +0300 Subject: [PATCH] [Stdlib] Fix K/N StringBuilder insertRange capacity issue --- .../runtime/src/main/kotlin/kotlin/text/StringBuilder.kt | 1 + libraries/stdlib/test/text/StringBuilderTest.kt | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/text/StringBuilder.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/text/StringBuilder.kt index b321aacdb27..d44e12ab170 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/text/StringBuilder.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/text/StringBuilder.kt @@ -611,6 +611,7 @@ actual class StringBuilder private constructor ( checkBoundsIndexes(startIndex, endIndex, value.size) val extraLength = endIndex - startIndex + ensureExtraCapacity(extraLength) array.copyInto(array, startIndex = index, endIndex = _length, destinationOffset = index + extraLength) value.copyInto(array, startIndex = startIndex, endIndex = endIndex, destinationOffset = index) diff --git a/libraries/stdlib/test/text/StringBuilderTest.kt b/libraries/stdlib/test/text/StringBuilderTest.kt index 991b7875de8..8549df1deb9 100644 --- a/libraries/stdlib/test/text/StringBuilderTest.kt +++ b/libraries/stdlib/test/text/StringBuilderTest.kt @@ -341,6 +341,14 @@ class StringBuilderTest { assertFails { sb.insertRange(0, charArrayOf('_', '*', '#'), 0, 4) } assertFails { sb.insertRange(0, charArrayOf('_', '*', '#'), 2, 1) } assertFails { sb.insertRange(0, charArrayOf('_', '*', '#'), 2, -1) } + + // Test insertion of large arrays that are likely to trigger increase of underlying array capacity + sb.insert(0, CharArray(1000) { ',' }) + assertTrue(sb.toString().take(1000).all { it == ',' }) + assertEquals("_my insertT CharArray test_", sb.toString().drop(1000)) + + sb.insertRange(0, CharArray(10000) { '@' }, 1000, 9000) + assertTrue(sb.toString().take(8000).all { it == '@' }) } }