JVM_IR: handle Nothing and Unit more consistently.
* 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.
This commit is contained in:
@@ -18,3 +18,6 @@ inline fun inlineCall(predicate: (String?) -> Boolean): Boolean {
|
||||
// 0 LINENUMBER 7
|
||||
// 0 LINENUMBER 8
|
||||
// 1 LINENUMBER 9
|
||||
|
||||
// Not actually inlined, so there is a LINENUMBER 7 because the if's body is not considered dead.
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
Reference in New Issue
Block a user