From f01420332f4379de425462b3ed9620f01ac39671 Mon Sep 17 00:00:00 2001 From: Abduqodiri Qurbonzoda Date: Thu, 12 Sep 2019 21:37:46 +0300 Subject: [PATCH] Avoid division in string-to-number conversions (KT-26309) --- .../kotlin/text/StringNumberConversions.kt | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/libraries/stdlib/src/kotlin/text/StringNumberConversions.kt b/libraries/stdlib/src/kotlin/text/StringNumberConversions.kt index 5b196ae8dc1..c238c9d4499 100644 --- a/libraries/stdlib/src/kotlin/text/StringNumberConversions.kt +++ b/libraries/stdlib/src/kotlin/text/StringNumberConversions.kt @@ -94,13 +94,25 @@ public fun String.toIntOrNull(radix: Int): Int? { } - val limitBeforeMul = limit / radix + val limitForMaxRadix = (-Int.MAX_VALUE) / 36 + + var limitBeforeMul = limitForMaxRadix var result = 0 - for (i in start..(length - 1)) { + for (i in start until length) { val digit = digitOf(this[i], radix) if (digit < 0) return null - if (result < limitBeforeMul) return null + if (result < limitBeforeMul) { + if (limitBeforeMul == limitForMaxRadix) { + limitBeforeMul = limit / radix + + if (result < limitBeforeMul) { + return null + } + } else { + return null + } + } result *= radix @@ -157,13 +169,25 @@ public fun String.toLongOrNull(radix: Int): Long? { } - val limitBeforeMul = limit / radix + val limitForMaxRadix = (-Long.MAX_VALUE) / 36 + + var limitBeforeMul = limitForMaxRadix var result = 0L - for (i in start..(length - 1)) { + for (i in start until length) { val digit = digitOf(this[i], radix) if (digit < 0) return null - if (result < limitBeforeMul) return null + if (result < limitBeforeMul) { + if (limitBeforeMul == limitForMaxRadix) { + limitBeforeMul = limit / radix + + if (result < limitBeforeMul) { + return null + } + } else { + return null + } + } result *= radix