ef5e02da84
* 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.
20 lines
400 B
Kotlin
Vendored
20 lines
400 B
Kotlin
Vendored
fun foo(x: Int) {
|
|
when (x) {
|
|
21 -> foo(x)
|
|
42 -> foo(x)
|
|
else -> foo(x)
|
|
}
|
|
|
|
val t = when (x) {
|
|
21 -> foo(x)
|
|
42 -> foo(x)
|
|
else -> foo(x)
|
|
}
|
|
}
|
|
|
|
// 2 3 4 5 6 +8 9 10 11 8 13
|
|
|
|
// JVM_IR also generates a LINENUMBER 12, which seems consistent with the fact that
|
|
// there is a LINENUMBER 6, but still fails the test.
|
|
// IGNORE_BACKEND: JVM_IR
|