JS: optimize loop over array.withIndex()

See KT-20932
This commit is contained in:
Alexey Andreev
2017-10-25 20:12:15 +03:00
parent 1be86e05ae
commit 132285ea03
5 changed files with 287 additions and 3 deletions
@@ -0,0 +1,55 @@
// EXPECTED_REACHABLE_NODES: 1128
// CHECK_CONTAINS_NO_CALLS: test1 except=toString
// CHECK_CONTAINS_NO_CALLS: test2 except=toString
// CHECK_CONTAINS_NO_CALLS: test3 except=toString
// CHECK_CONTAINS_NO_CALLS: test4 except=toString
fun test1(a: Array<String>): String {
var s = ""
for ((i, x) in a.withIndex()) {
s += "$i:$x;"
}
return s
}
fun test2(a: Array<String>): String {
var s = ""
for ((_, x) in a.withIndex()) {
s += "$x;"
}
return s
}
fun test3(a: Array<String>): String {
var s = ""
for ((i, _) in a.withIndex()) {
s += "$i;"
}
return s
}
fun test4(a: Array<String>): String {
var s = ""
for (i in a.indices) {
s += "$i;"
}
return s
}
fun box(): String {
val array = arrayOf("foo", "bar", "baz")
var r = test1(array)
if (r != "0:foo;1:bar;2:baz;") return "fail1: $r"
r = test2(array)
if (r != "foo;bar;baz;") return "fail2: $r"
r = test3(array)
if (r != "0;1;2;") return "fail3: $r"
r = test4(array)
if (r != "0;1;2;") return "fail4: $r"
return "OK"
}
@@ -0,0 +1,55 @@
// EXPECTED_REACHABLE_NODES: 1461
// CHECK_NOT_CALLED_IN_SCOPE: function=component1 scope=test1
// CHECK_NOT_CALLED_IN_SCOPE: function=component1 scope=test2
// CHECK_NOT_CALLED_IN_SCOPE: function=component1 scope=test3
// CHECK_CONTAINS_NO_CALLS: test4 except=toString
fun test1(a: Sequence<String>): String {
var s = ""
for ((i, x) in a.withIndex()) {
s += "$i:$x;"
}
return s
}
fun test2(a: Collection<String>): String {
var s = ""
for ((_, x) in a.withIndex()) {
s += "$x;"
}
return s
}
fun test3(a: List<String>): String {
var s = ""
for ((i, _) in a.withIndex()) {
s += "$i;"
}
return s
}
fun test4(a: Set<String>): String {
var s = ""
for (i in a.indices) {
s += "$i;"
}
return s
}
fun box(): String {
val list = listOf("foo", "bar", "baz")
var r = test1(list.asSequence())
if (r != "0:foo;1:bar;2:baz;") return "fail1: $r"
r = test2(list)
if (r != "foo;bar;baz;") return "fail2: $r"
r = test3(list)
if (r != "0;1;2;") return "fail3: $r"
r = test4(list.toSet())
if (r != "0;1;2;") return "fail4: $r"
return "OK"
}