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:
@@ -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"
|
||||
}
|
||||
+21
@@ -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"
|
||||
}
|
||||
Reference in New Issue
Block a user