JS backend: for with label, fix KT-5257 JS: for with continue with label fails on runtime, and KT-5262 JS: wrong code for for over range when start greater end

#KT-5257 Fixed
 #KT-5262 Fixed
This commit is contained in:
Michael Nedzelsky
2014-08-20 12:25:14 +04:00
parent 932bd57cf9
commit ab0df532bc
12 changed files with 228 additions and 54 deletions
@@ -16,5 +16,13 @@ fun box(): Boolean {
d += 1
}
}
return (c == 2) && (d == 8)
assertEquals(2, c)
assertEquals(8, d)
var s: String = ""
for(i in array(0,1,2))
try { s += "A${i}:"} finally {}
assertEquals("A0:A1:A2:", s)
return true
}
@@ -0,0 +1,44 @@
package foo
var global: String = ""
fun up(s: String, value: Int): Int {
global += s
return value
}
fun box(): String {
// http://youtrack.jetbrains.com/issue/KT-5262
// JS: wrong code for `for` over range when start greater end
var n: Int = 0
for(i in 3..0)
n++
assertEquals(0, n)
for(i in 0..3)
n++
assertEquals(4, n)
// Evaluation order
for (i in up("A", 0)..up("B", 5)) {
}
assertEquals("AB", global)
global = ""
for (i in try { up("A", 0) } finally {} ..up("B", 5)) {
}
assertEquals("AB", global)
global = ""
for (i in up("A", 0).. try { up("B", 5)} finally {}) {
}
assertEquals("AB", global)
global = ""
for (i in try { up("A", 0) } finally {}.. try { up("B", 5)} finally {}) {
}
assertEquals("AB", global)
return "OK"
}
@@ -0,0 +1,16 @@
package foo
fun box(): String {
var n = 0
var r = 3..0
for(i in r)
n++
assertEquals(0, n)
r = 0..3
for(i in r)
n++
assertEquals(4, n)
return "OK"
}
@@ -0,0 +1,21 @@
package foo
class Iter(val upper: Int) {
var count: Int = 0
fun hasNext(): Boolean = count < upper
fun next(): Int = count++
}
class A(val upper: Int) {
fun iterator(): Iter = Iter(upper)
}
fun box(): String {
var n = 0
for(i in A(10)) {
n++
}
assertEquals(10, n)
return "OK"
}
@@ -0,0 +1,49 @@
package foo
fun box(): String {
var n = 0
@forLabel0 for(i in 0..10) {
var j = 0
@whileLabel0 while(j++<i) {
n++;
if (j==2)
continue@forLabel0
}
}
assertEquals(19, n)
n = 0
@forLabel1 for(i in 0..10) {
var j = 0
@whileLabel1 while(try {j++} finally {} <i) {
n++;
if (j==2)
continue@forLabel1
}
}
assertEquals(19, n)
n = 0
@forLabel2 for(i in 0..10) {
var j = 0
@whileLabel2 while(j++<i) {
n++;
if (j==2)
break@forLabel2
}
}
assertEquals(3, n)
n = 0
@forLabel3 for(i in 0..10) {
var j = 0
@whileLabel3 while(j++<i) {
n++;
if (j==2)
break@whileLabel3
}
}
assertEquals(19, n)
return "OK"
}
@@ -0,0 +1,36 @@
// http://youtrack.jetbrains.com/issue/KT-5257
// JS: for with continue with label fails on runtime
package foo
var global: String = ""
fun up(s: String, value: Int): Int {
global += s
return value
}
fun box(): String {
@list
for (i in 0..up("A", 5)) {
continue @list
}
assertEquals("A", global)
global = ""
@list1
for (i in up("A", 0)..try { global += "B"; 5} finally {}) {
continue @list1
}
assertEquals("AB", global)
global = ""
@list2
for (i in try { up("A", 0) } finally {}..try { global += "B"; 5} finally {}) {
continue @list2
}
assertEquals("AB", global)
return "OK"
}