mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-05-10 15:53:46 +00:00
* In blocks, discard the result of any statement that has a return type other than void. This was previously done by wrapping each statement into an "implicit Unit conversion" that was actually compiled down to a stack pop instead. If an expression happened to already have type Unit, however, such a conversion was not inserted, resulting in a stray reference on the stack. These conversions are now redundant and should probably be removed. * In assignments and non-exhaustive conditionals, materialize a Unit on the stack to avoid depth mismatches that trip up the bytecode validator. Because such expressions are generally used at block level (and, indeed, the frontend will reject a non-exhaustive conditional used as an expression), combined with the above change this results in no additional GETSTATIC opcodes, as they are immediately removed by the peephole optimizer.
27 lines
509 B
Kotlin
Vendored
27 lines
509 B
Kotlin
Vendored
// CHECK_CASES_COUNT: function=test1 count=2
|
|
// CHECK_IF_COUNT: function=test1 count=0
|
|
// CHECK_BREAKS_COUNT: function=test1 count=1
|
|
|
|
// CHECK_CASES_COUNT: function=test2 count=2
|
|
// CHECK_IF_COUNT: function=test2 count=0
|
|
// CHECK_BREAKS_COUNT: function=test2 count=1
|
|
|
|
fun test1(v: Int) {
|
|
when (v) {
|
|
1, 2 -> Unit
|
|
}
|
|
}
|
|
|
|
fun test2(v: Int) {
|
|
loop@ while(true) {
|
|
when (v) {
|
|
1, 2 -> break@loop
|
|
}
|
|
}
|
|
}
|
|
|
|
fun box(): String {
|
|
test1(1)
|
|
test2(1)
|
|
return "OK"
|
|
} |