KT-7819 Implement non-local returns

This commit is contained in:
Alexey Andreev
2016-04-04 18:47:55 +03:00
parent a6e1bd1d89
commit 05887f45f7
31 changed files with 310 additions and 182 deletions
@@ -16,6 +16,11 @@ fun barLt(): String {
10 < (return "lt") as Int
}
fun setGlobal(i: Int): Int {
global = "setGlobal"
return i
}
fun box(): String {
var b: Boolean
@@ -66,6 +71,15 @@ fun box(): String {
assertEquals(2, i, "break 6")
assertEquals("A", global, "break 6")
i = 0
while(i++<5) {
if (i==2) {
bVarArray[setGlobal(0)] = 10 < (break as Int)
}
}
assertEquals(2, i, "break 6a")
assertEquals("setGlobal", global, "break 6a")
i = 0
global = ""
while(i++<5) {
@@ -0,0 +1,46 @@
package foo
var state = false
inline fun blockImpl(p: () -> Unit) {
if (state) return
p()
}
inline fun block(p: () -> Unit) {
if (state) return
blockImpl(p)
}
fun test(x: Int): Int {
block outer@ {
block inner@ {
if (x < 10) return@inner
if (x == 10) return@outer
block innermost@ {
if (x > 500) {
return 500500
}
}
return x
}
if (x < 5) return@outer
return x + 10
}
return x + 100
}
fun box(): String {
assertEquals(16, test(6))
assertEquals(104, test(4))
assertEquals(110, test(110))
assertEquals(11, test(11))
assertEquals(500500, test(502))
return "OK"
}