diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/StringConcatGenerator.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/StringConcatGenerator.kt index 4e6f8e4404f..98b4e7d931c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/StringConcatGenerator.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/StringConcatGenerator.kt @@ -38,7 +38,7 @@ class StringConcatGenerator(val mode: JvmStringConcat, val mv: InstructionAdapte value.encodedUTF8Size() } - fun fitEncodingLimit() = encodedUTF8Size <= STRING_UTF8_ENCODING_BYTE_LIMIT + fun fitEncodingLimit() = if (value.isDefinitelyFitEncodingLimit()) true else encodedUTF8Size <= STRING_UTF8_ENCODING_BYTE_LIMIT } private val items = arrayListOf() diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt index 2a15e8b0022..7eeca3d51df 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/codegenUtil.kt @@ -682,11 +682,11 @@ fun linkedLabel(): Label = LabelNode().linkWithLabel().label // Strings in constant pool contain at most 2^16-1 = 65535 bytes. const val STRING_UTF8_ENCODING_BYTE_LIMIT: Int = 65535 -fun splitStringConstant(value: String): List { - val length = value.length +//Each CHAR could be encoded maximum in 3 bytes +fun String.isDefinitelyFitEncodingLimit() = length <= STRING_UTF8_ENCODING_BYTE_LIMIT / 3 - //Each CHAR could be encoded maximum in 3 bytes - return if (length <= STRING_UTF8_ENCODING_BYTE_LIMIT / 3) { +fun splitStringConstant(value: String): List { + return if (value.isDefinitelyFitEncodingLimit()) { listOf(value) } else { val result = arrayListOf() @@ -696,6 +696,7 @@ fun splitStringConstant(value: String): List { var accumulatedSize = 0 var charOffsetInString = 0 var lastStringBeginning = 0 + val length = value.length while (charOffsetInString < length) { val charCode = value[charOffsetInString].code val encodedCharSize = when {