diff --git a/compiler/testData/codegen/box/primitiveTypes/stringEqualsHashCodeToString.kt b/compiler/testData/codegen/box/primitiveTypes/stringEqualsHashCodeToString.kt index 96c53bef210..4916436b4d2 100644 --- a/compiler/testData/codegen/box/primitiveTypes/stringEqualsHashCodeToString.kt +++ b/compiler/testData/codegen/box/primitiveTypes/stringEqualsHashCodeToString.kt @@ -1,5 +1,3 @@ -// DONT_TARGET_EXACT_BACKEND: WASM -// WASM_MUTE_REASON: String.hashCode() // IGNORE_BACKEND: NATIVE fun test(s: String) { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index ebad0a17b09..1a2f2500906 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -11728,6 +11728,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/primitiveTypes/rangeTo.kt"); } + @TestMetadata("stringEqualsHashCodeToString.kt") + public void testStringEqualsHashCodeToString() throws Exception { + runTest("compiler/testData/codegen/box/primitiveTypes/stringEqualsHashCodeToString.kt"); + } + @TestMetadata("unboxComparable.kt") public void testUnboxComparable() throws Exception { runTest("compiler/testData/codegen/box/primitiveTypes/unboxComparable.kt"); diff --git a/libraries/stdlib/wasm/builtins/kotlin/String.kt b/libraries/stdlib/wasm/builtins/kotlin/String.kt index c6682cc4814..83a1625468a 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/String.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/String.kt @@ -56,8 +56,16 @@ public class String internal constructor(internal val chars: CharArray) : Compar public override fun toString(): String = this - // TODO: this is not nice - public override fun hashCode(): Int = 10 + private var cachedHash: Int = 0 + public override fun hashCode(): Int { + if (cachedHash != 0 || this.isEmpty()) + return cachedHash + var hash = 0 + for (c in chars) + hash = 31 * hash + c.toInt() + cachedHash = hash + return cachedHash + } } internal fun stringLiteral(startAddr: Int, length: Int) = String(unsafeRawMemoryToCharArray(startAddr, length))