From e3bcabeae3cd1e74596963a7e5d56009833ec220 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Sun, 5 May 2019 18:54:33 +0300 Subject: [PATCH] [JS IR] stdlib: Fix bugs in Long.toString(radix) --- compiler/ir/serialization.js/build.gradle.kts | 1 + libraries/stdlib/js-ir/runtime/long.kt | 2 +- libraries/stdlib/js-ir/runtime/longjs.kt | 9 +++++---- .../js-ir/src/kotlin/text/numberConversions.kt | 15 +++++++++++++++ .../js-v1/src/kotlin/text/numberConversions.kt | 14 ++++++++++++++ .../js/src/kotlin/text/numberConversions.kt | 8 -------- 6 files changed, 36 insertions(+), 13 deletions(-) create mode 100644 libraries/stdlib/js-ir/src/kotlin/text/numberConversions.kt create mode 100644 libraries/stdlib/js-v1/src/kotlin/text/numberConversions.kt diff --git a/compiler/ir/serialization.js/build.gradle.kts b/compiler/ir/serialization.js/build.gradle.kts index f9b50e3bbe6..981cfc2a4b3 100644 --- a/compiler/ir/serialization.js/build.gradle.kts +++ b/compiler/ir/serialization.js/build.gradle.kts @@ -106,6 +106,7 @@ val reducedRuntimeSources by task { "libraries/stdlib/common/src/kotlin/ioH.kt", "libraries/stdlib/js-ir/runtime/collectionsHacks.kt", "libraries/stdlib/js-ir/src/generated/**", + "libraries/stdlib/js-ir/src/kotlin/text/**", "libraries/stdlib/js/src/jquery/**", "libraries/stdlib/js/src/org.w3c/**", "libraries/stdlib/js/src/kotlin/char.kt", diff --git a/libraries/stdlib/js-ir/runtime/long.kt b/libraries/stdlib/js-ir/runtime/long.kt index ed017fc0ef4..90fdb151716 100644 --- a/libraries/stdlib/js-ir/runtime/long.kt +++ b/libraries/stdlib/js-ir/runtime/long.kt @@ -259,5 +259,5 @@ public class Long internal constructor( override fun hashCode(): Int = hashCode(this) - override fun toString(): String = toString(10) + override fun toString(): String = this.toStringImpl(radix = 10) } \ No newline at end of file diff --git a/libraries/stdlib/js-ir/runtime/longjs.kt b/libraries/stdlib/js-ir/runtime/longjs.kt index 1d24d674b46..77121b40e25 100644 --- a/libraries/stdlib/js-ir/runtime/longjs.kt +++ b/libraries/stdlib/js-ir/runtime/longjs.kt @@ -24,7 +24,7 @@ internal fun Long.getLowBitsUnsigned() = if (low >= 0) low.toDouble() else TWO_P internal fun hashCode(l: Long) = l.low xor l.high -internal fun Long.toString(radix: Int): String { +internal fun Long.toStringImpl(radix: Int): String { if (radix < 2 || 36 < radix) { throw Exception("radix out of range: $radix") } @@ -39,10 +39,11 @@ internal fun Long.toString(radix: Int): String { // the bottom-most digit in this base and then recurse to do the rest. val radixLong = fromInt(radix) val div = div(radixLong) - val rem = div.multiply(radixLong).subtract(this).toInt(); - return js("div.toString(radix) + rem.toString(radix)") + val rem = div.multiply(radixLong).subtract(this).toInt() + // Using rem.asDynamic() to break dependency on "kotlin.text" package + return div.toStringImpl(radix) + rem.asDynamic().toString(radix).unsafeCast() } else { - return "-${negate().toString()}" + return "-${negate().toStringImpl(radix)}" } } diff --git a/libraries/stdlib/js-ir/src/kotlin/text/numberConversions.kt b/libraries/stdlib/js-ir/src/kotlin/text/numberConversions.kt new file mode 100644 index 00000000000..5a17b444518 --- /dev/null +++ b/libraries/stdlib/js-ir/src/kotlin/text/numberConversions.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package kotlin.text + +/** + * Returns a string representation of this [Long] value in the specified [radix]. + * + * @throws IllegalArgumentException when [radix] is not a valid radix for number to string conversion. + */ +@SinceKotlin("1.2") +public actual fun Long.toString(radix: Int): String = + this.toStringImpl(checkRadix(radix)) \ No newline at end of file diff --git a/libraries/stdlib/js-v1/src/kotlin/text/numberConversions.kt b/libraries/stdlib/js-v1/src/kotlin/text/numberConversions.kt new file mode 100644 index 00000000000..f3458933f04 --- /dev/null +++ b/libraries/stdlib/js-v1/src/kotlin/text/numberConversions.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package kotlin.text + +/** + * Returns a string representation of this [Long] value in the specified [radix]. + * + * @throws IllegalArgumentException when [radix] is not a valid radix for number to string conversion. + */ +@SinceKotlin("1.2") +public actual fun Long.toString(radix: Int): String = asDynamic().toString(checkRadix(radix)) \ No newline at end of file diff --git a/libraries/stdlib/js/src/kotlin/text/numberConversions.kt b/libraries/stdlib/js/src/kotlin/text/numberConversions.kt index 261a5dc8416..c701aa85c29 100644 --- a/libraries/stdlib/js/src/kotlin/text/numberConversions.kt +++ b/libraries/stdlib/js/src/kotlin/text/numberConversions.kt @@ -113,14 +113,6 @@ public actual inline fun Byte.toString(radix: Int): String = this.toInt().toStri @kotlin.internal.InlineOnly public actual inline fun Short.toString(radix: Int): String = this.toInt().toString(radix) -/** - * Returns a string representation of this [Long] value in the specified [radix]. - * - * @throws IllegalArgumentException when [radix] is not a valid radix for number to string conversion. - */ -@SinceKotlin("1.2") -public actual fun Long.toString(radix: Int): String = asDynamic().toString(checkRadix(radix)) - /** * Returns a string representation of this [Int] value in the specified [radix]. *