Align the Boolean.hashCode() value across platforms
Boolean.hashCode() should return 1231/1237 for true/false correspondingly. As a part of efforts to stabilize Native stdlib.
This commit is contained in:
committed by
Space Team
parent
668157eb41
commit
193aa0f935
@@ -146,6 +146,7 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC
|
||||
|
||||
val jsCode = getInternalFunction("js") // js("<code>")
|
||||
val jsHashCode = getInternalFunction("hashCode")
|
||||
val jsGetBooleanHashCode = getInternalFunction("getBooleanHashCode")
|
||||
val jsGetNumberHashCode = getInternalFunction("getNumberHashCode")
|
||||
val jsGetObjectHashCode = getInternalFunction("getObjectHashCode")
|
||||
val jsGetStringHashCode = getInternalFunction("getStringHashCode")
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
@@ -11,44 +11,48 @@ fun <T> 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)
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
97
|
||||
1065353216
|
||||
1072693248
|
||||
1
|
||||
0
|
||||
1231
|
||||
1237
|
||||
true
|
||||
true
|
||||
|
||||
@@ -62,5 +62,5 @@ public class Boolean private constructor() : Comparable<Boolean> {
|
||||
@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
|
||||
}
|
||||
@@ -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<Boolean>()) 1 else 0
|
||||
"boolean" -> getBooleanHashCode(obj.unsafeCast<Boolean>())
|
||||
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$"
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -79,7 +79,7 @@ return (obj) => {
|
||||
case "number":
|
||||
return numberHashCode(obj);
|
||||
case "boolean":
|
||||
return obj;
|
||||
return obj ? 1231 : 1237;
|
||||
default:
|
||||
return getStringHashCode(String(obj));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user