mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-05-09 00:21:47 +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.
37 lines
590 B
Kotlin
Vendored
37 lines
590 B
Kotlin
Vendored
// FILE: 1.kt
|
|
// WITH_RUNTIME
|
|
package test
|
|
|
|
var res = 1
|
|
|
|
class A {
|
|
|
|
inline operator fun Int.get(z: Int, p: () -> Int, defaultt: Int = 100) = this + z + p() + defaultt
|
|
|
|
inline operator fun Int.set(z: Int, p: () -> Int, l: Int/*, x : Int = 1000*/) {
|
|
res = this + z + p() + l /*+ x*/
|
|
}
|
|
}
|
|
|
|
// FILE: 2.kt
|
|
|
|
import test.*
|
|
|
|
|
|
fun box(): String {
|
|
|
|
val z = 1;
|
|
|
|
with(A()) {
|
|
|
|
val p = z[2, { 3 }]
|
|
if (p != 106) return "fail 1: $p"
|
|
|
|
val captured = 3;
|
|
z[2, { captured }] = p
|
|
if (res != 112) return "fail 2: $res"
|
|
}
|
|
|
|
return "OK"
|
|
}
|