JS: improve optimization of for loop over range literals

See KT-18329, partial fix for KT-8372
This commit is contained in:
Alexey Andreev
2017-09-08 14:29:21 +03:00
parent 502c51ccff
commit 1350e3c4ac
3 changed files with 197 additions and 21 deletions
@@ -0,0 +1,110 @@
// EXPECTED_REACHABLE_NODES: 1006
// CHECK_CONTAINS_NO_CALLS: testRangeTo
// CHECK_CONTAINS_NO_CALLS: testRangeToFunction
// CHECK_CONTAINS_NO_CALLS: testUntil
// CHECK_CONTAINS_NO_CALLS: testDownTo
// CHECK_CONTAINS_NO_CALLS: testStep
// CHECK_CONTAINS_NO_CALLS: testEmptyRange
// CHECK_CONTAINS_NO_CALLS: testRangeToParams except=from;to
fun testRangeTo(): String {
var result = ""
for (x in 1..3) {
result += x
}
return result
}
fun testRangeToFunction(): String {
var result = ""
for (x in 1.rangeTo(3)) {
result += x
}
return result
}
fun testUntil(): String {
var result = ""
for (x in 1 until 4) {
result += x
}
return result
}
fun testDownTo(): String {
var result = ""
for (x in 3 downTo 1) {
result += x
}
return result
}
fun testStep(): String {
var result = ""
for (x in 1..5 step 2) {
result += x
}
result += ";"
for (x in 1 until 6 step 2) {
result += x
}
result += ";"
for (x in 6.downTo(1).step(2)) {
result += x
}
return result
}
fun testEmptyRange(): String {
var result = ""
for (x in 3..1) {
result += x
}
return result
}
fun testRangeToParams(from: () -> Int, to: () -> Int): String {
var result = ""
for (x in (from()..to())) {
result += x
}
return result
}
fun box(): String {
var r = testRangeTo()
if (r != "123") return "fail: rangeTo: $r"
r = testRangeToFunction()
if (r != "123") return "fail: rangeToFunction: $r"
r = testUntil()
if (r != "123") return "fail: until: $r"
r = testDownTo()
if (r != "321") return "fail: downTo: $r"
r = testStep()
if (r != "135;135;642") return "fail: $r"
r = testEmptyRange()
if (r != "") return "fail: emptyRange: $r"
r = testRangeToParams({ 1 }, { 3 })
if (r != "123") return "fail: rangeTo(1, 3): $r"
var se = ""
r = testRangeToParams({ se += "Q"; 1 }, { se += "W"; 3 })
if (r != "123") return "fail: rangeTo(1, 3) with side effects: $r"
if (se != "QW") return "fail: rangeTo(1, 3): side effects: $se"
se = ""
r = testRangeToParams({ se += "Q"; 3 }, { se += "W"; 1 })
if (r != "") return "fail: rangeTo(1, 3) with side effects: $r"
if (se != "QW") return "fail: rangeTo(1, 3): side effects: $se"
return "OK"
}