diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt index 327026f18c2..99474073389 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt @@ -146,6 +146,7 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC val jsCode = getInternalFunction("js") // js("") val jsHashCode = getInternalFunction("hashCode") + val jsGetBooleanHashCode = getInternalFunction("getBooleanHashCode") val jsGetNumberHashCode = getInternalFunction("getNumberHashCode") val jsGetObjectHashCode = getInternalFunction("getObjectHashCode") val jsGetStringHashCode = getInternalFunction("getStringHashCode") diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberOperatorCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberOperatorCallsTransformer.kt index 674bb265f55..edcf5315c16 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberOperatorCallsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/NumberOperatorCallsTransformer.kt @@ -57,7 +57,7 @@ class NumberOperatorCallsTransformer(context: JsIrBackendContext) : CallsTransfo add(it, OperatorNames.NOT, intrinsics.jsNot) - add(it, HASH_CODE_NAME) { call -> toInt32(call.dispatchReceiver!!) } + add(it, HASH_CODE_NAME, intrinsics.jsGetBooleanHashCode) } for (type in primitiveNumbers) { diff --git a/kotlin-native/backend.native/tests/codegen/boxing/box_cache0.kt b/kotlin-native/backend.native/tests/codegen/boxing/box_cache0.kt index 67330fbbafe..69c79ab9024 100644 --- a/kotlin-native/backend.native/tests/codegen/boxing/box_cache0.kt +++ b/kotlin-native/backend.native/tests/codegen/boxing/box_cache0.kt @@ -11,44 +11,48 @@ fun areSame(arg1: T, arg2: T): Boolean { return arg1 === arg2 } +fun Boolean.oneIfTrueElseZero(): Int { + return if (this) 1 else 0 +} + @Test fun runTest() { var acc = 0 val range = 1000 for (i in arrayOf(false, true)) { for (j in arrayOf(false, true)) { - acc += areSame(i, j).hashCode() + acc += areSame(i, j).oneIfTrueElseZero() } } println(acc) acc = 0 for (i in Byte.MIN_VALUE..Byte.MAX_VALUE) { - acc += areSame(i, i).hashCode() + acc += areSame(i, i).oneIfTrueElseZero() } println(acc) acc = 0 for (i in Short.MIN_VALUE..Short.MAX_VALUE) { - acc += areSame(i, i).hashCode() + acc += areSame(i, i).oneIfTrueElseZero() } println(acc) acc = 0 for (i in 0.toChar()..range.toChar()) { - acc += areSame(i, i).hashCode() + acc += areSame(i, i).oneIfTrueElseZero() } println(acc) acc = 0 for (i in -range..range) { - acc += areSame(i, i).hashCode() + acc += areSame(i, i).oneIfTrueElseZero() } println(acc) acc = 0 for (i in -range.toLong()..range.toLong()) { - acc += areSame(i, i).hashCode() + acc += areSame(i, i).oneIfTrueElseZero() } println(acc) } \ No newline at end of file diff --git a/kotlin-native/backend.native/tests/runtime/basic/hash0.out b/kotlin-native/backend.native/tests/runtime/basic/hash0.out index ea08c8f27e1..a6c45a1095d 100644 --- a/kotlin-native/backend.native/tests/runtime/basic/hash0.out +++ b/kotlin-native/backend.native/tests/runtime/basic/hash0.out @@ -3,7 +3,7 @@ 97 1065353216 1072693248 -1 -0 +1231 +1237 true true diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/Boolean.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/Boolean.kt index 267b4d51b49..a12b2c6e07d 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/Boolean.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/Boolean.kt @@ -62,5 +62,5 @@ public class Boolean private constructor() : Comparable { @kotlin.internal.IntrinsicConstEvaluation public override fun toString() = if (this) "true" else "false" - public override fun hashCode() = if (this) 1 else 0 + public override fun hashCode() = if (this) 1231 else 1237 } \ No newline at end of file diff --git a/libraries/stdlib/js-ir/runtime/coreRuntime.kt b/libraries/stdlib/js-ir/runtime/coreRuntime.kt index 83521273b7e..844218ebff5 100644 --- a/libraries/stdlib/js-ir/runtime/coreRuntime.kt +++ b/libraries/stdlib/js-ir/runtime/coreRuntime.kt @@ -48,11 +48,15 @@ internal fun hashCode(obj: dynamic): Int { "object" -> if ("function" === jsTypeOf(obj.hashCode)) (obj.hashCode)() else getObjectHashCode(obj) "function" -> getObjectHashCode(obj) "number" -> getNumberHashCode(obj) - "boolean" -> if(obj.unsafeCast()) 1 else 0 + "boolean" -> getBooleanHashCode(obj.unsafeCast()) else -> getStringHashCode(js("String")(obj)) } } +internal fun getBooleanHashCode(value: Boolean): Int { + return if (value) 1231 else 1237 +} + private const val POW_2_32 = 4294967296.0 private const val OBJECT_HASH_CODE_PROPERTY_NAME = "kotlinHashCodeValue$" diff --git a/libraries/stdlib/js-v1/src/js/core.js b/libraries/stdlib/js-v1/src/js/core.js index e74e68aa6d2..2f4bf80c7a5 100644 --- a/libraries/stdlib/js-v1/src/js/core.js +++ b/libraries/stdlib/js-v1/src/js/core.js @@ -42,7 +42,7 @@ Kotlin.hashCode = function (obj) { return Kotlin.numberHashCode(obj); } if ("boolean" === objType) { - return Number(obj) + return obj ? 1231 : 1237; } var str = String(obj); diff --git a/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt b/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt index c76144d6402..5851cf010b6 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt @@ -58,7 +58,7 @@ public class Boolean private constructor(private val value: Boolean) : Comparabl if (this) "true" else "false" override fun hashCode(): Int = - toInt() + if (this) 1231 else 1237 @kotlin.internal.IntrinsicConstEvaluation override fun equals(other: Any?): Boolean { diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/ExternalWrapper.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/ExternalWrapper.kt index ebcf85c0692..808cfd479df 100644 --- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/ExternalWrapper.kt +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/ExternalWrapper.kt @@ -79,7 +79,7 @@ return (obj) => { case "number": return numberHashCode(obj); case "boolean": - return obj; + return obj ? 1231 : 1237; default: return getStringHashCode(String(obj)); }