when: emit switch for String if possible
Effectively, the following when structure:
when (s) {
s1, s2 -> e1,
s3 -> e2,
s4 -> e3,
...
else -> e
}
is implemented as:
when (s.hashCode()) {
h1 -> {
if (s == s1)
e1
else if (s == s2)
e1
else if (s == s3)
e2
else
e
}
h2 -> if (s == s3) e2 else e,
...
else -> e
}
where s1.hashCode() == s2.hashCode() == s3.hashCode() == h1,
s4.hashCode() == h2.
A tableswitch or lookupswitch is used for the hash code lookup.
Change-Id: I087bf623dbb4a41d3cc64399a1b42342a50757a6
This commit is contained in:
committed by
max-kammerer
parent
1a9ed88be4
commit
f6cf434650
+20
@@ -0,0 +1,20 @@
|
||||
fun foo(x: Int): String {
|
||||
return when (x) {
|
||||
2_147_483_647 -> "MAX"
|
||||
-2_147_483_648 -> "MIN"
|
||||
else -> "else"
|
||||
}
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
if (foo(0) != "else")
|
||||
return "0: " + foo(0).toString()
|
||||
|
||||
if (foo(Int.MAX_VALUE) != "MAX")
|
||||
return "Int.MAX_VALUE: " + foo(Int.MAX_VALUE).toString()
|
||||
|
||||
if (foo(Int.MIN_VALUE) != "MIN")
|
||||
return "Int.MIN_VALUE: " + foo(Int.MIN_VALUE).toString()
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
// IGNORE_BACKEND: NATIVE
|
||||
// IGNORE_BACKEND: JS_IR
|
||||
// TODO: muted automatically, investigate should it be ran for JS or not
|
||||
// IGNORE_BACKEND: JS
|
||||
|
||||
// WITH_RUNTIME
|
||||
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
fun foo(x : String) : String {
|
||||
assert("abz]".hashCode() == "aby|".hashCode())
|
||||
|
||||
when (x) {
|
||||
"abz]" -> return "abz"
|
||||
"ghi" -> return "ghi"
|
||||
"aby|" -> return "aby"
|
||||
"abz]" -> return "fail"
|
||||
}
|
||||
|
||||
return "other"
|
||||
}
|
||||
|
||||
fun box() : String {
|
||||
assertEquals("abz", foo("abz]"))
|
||||
assertEquals("aby", foo("aby|"))
|
||||
assertEquals("ghi", foo("ghi"))
|
||||
|
||||
assertEquals("other", foo("xyz"))
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
// IGNORE_BACKEND: NATIVE
|
||||
// IGNORE_BACKEND: JS_IR
|
||||
// TODO: muted automatically, investigate should it be ran for JS or not
|
||||
// IGNORE_BACKEND: JS
|
||||
|
||||
// WITH_RUNTIME
|
||||
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
fun foo(x : String) : String {
|
||||
assert("abz]".hashCode() == "aby|".hashCode())
|
||||
|
||||
when (x) {
|
||||
"abz]" -> return "abz"
|
||||
"ghi" -> return "ghi"
|
||||
"aby|" -> return "aby"
|
||||
"abz]" -> return "fail"
|
||||
"uvw" -> return "uvw"
|
||||
}
|
||||
|
||||
return "other"
|
||||
}
|
||||
|
||||
fun box() : String {
|
||||
assertEquals("abz", foo("abz]"))
|
||||
assertEquals("aby", foo("aby|"))
|
||||
assertEquals("ghi", foo("ghi"))
|
||||
assertEquals("uvw", foo("uvw"))
|
||||
|
||||
assertEquals("other", foo("xyz"))
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
fun foo(x: Int): Int {
|
||||
return when (x) {
|
||||
1, 1, 2 -> 1001
|
||||
1, 2 -> 1002
|
||||
1 -> 1003
|
||||
2 -> 1004
|
||||
3 -> 1005
|
||||
else -> 1006
|
||||
}
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
if (foo(0) != 1006)
|
||||
return "0: " + foo(0)
|
||||
|
||||
if (foo(1) != 1001)
|
||||
return "1: " + foo(1)
|
||||
|
||||
if (foo(2) != 1001)
|
||||
return "2: " + foo(2)
|
||||
|
||||
if (foo(3) != 1005)
|
||||
return "3: " + foo(3)
|
||||
|
||||
if (foo(4) != 1006)
|
||||
return "4: " + foo(4)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user