Avoid division in string-to-number conversions (KT-26309)

This commit is contained in:
Abduqodiri Qurbonzoda
2019-09-12 21:37:46 +03:00
parent 11f3c4b03f
commit f01420332f
@@ -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